尝试在 Graphql-Yoga 服务器中使用 Google Oauth2 和 Passportjs
Trying to use Google Oauth2 with Passportjs in Graphql-Yoga Server
我以为我正确地遵循了所有文档来实现这个,但是,我收到一个 TokenError: Bad Request
,其中包含错误消息 invalid_grant
。
我的服务器超级简单:
require('dotenv').config();
import createServer from './createServer';
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const server = createServer();
passport.use(
new GoogleStrategy(
{
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: 'http://localhost:4000/auth/callback',
},
(accessToken, refreshToken, profile, cb) => {
console.log(accessToken);
console.log(refreshToken);
console.log(profile);
cb(null, profile);
},
),
);
server.express.use(
'/auth',
passport.authenticate('google', {
scope: ['email', 'profile'],
session: false,
}),
);
server.express.use(
'/auth/callback',
passport.authenticate('google', {
successRedirect: 'http://localhost:3000/authenticate',
failureRedirect: 'http://localhost:3000/authenticate',
}),
);
server.start(
{
cors: {
credentials: true,
origin: 'http://localhost:3000',
},
},
() => console.log('Server is running on http://localhost:4000'),
);
这是我在云平台设置Google的方式有问题吗?我不知道我哪里出错了。我的回调设置正确。我不确定还能在哪里查找错误?
另一件令人困惑的事情是 GoogleStategy 是控制台记录用户配置文件和返回的访问令牌。我猜测错误是在回调路由尝试验证来自 URL 的代码时出现的。谁能指出我的方向以更好地解决这个问题?提前致谢。
我找到了适合我的解决方案,但我仍然不清楚它是否 "best-practice"。我希望有更多 GraphQL 经验的人插话。
我按照文档中的说明在前端进行身份验证:https://developers.google.com/identity/sign-in/web/backend-auth
然后我在后端写了一个名为 isAuthenticated 的查询,我可以用它来验证令牌。
async isAuthenticated(_: any, { token }) {
if(!token) {
return null;
}
const ticket = await client.verifyIdToken({
idToken: token,
audience: process.env.GOOGLE_CLIENT_ID,
});
return payload;
},
在呈现任何受保护的路由之前,我使用 React 组件检查 localStorage 中的令牌。这对我有用。
我以为我正确地遵循了所有文档来实现这个,但是,我收到一个 TokenError: Bad Request
,其中包含错误消息 invalid_grant
。
我的服务器超级简单:
require('dotenv').config();
import createServer from './createServer';
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const server = createServer();
passport.use(
new GoogleStrategy(
{
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: 'http://localhost:4000/auth/callback',
},
(accessToken, refreshToken, profile, cb) => {
console.log(accessToken);
console.log(refreshToken);
console.log(profile);
cb(null, profile);
},
),
);
server.express.use(
'/auth',
passport.authenticate('google', {
scope: ['email', 'profile'],
session: false,
}),
);
server.express.use(
'/auth/callback',
passport.authenticate('google', {
successRedirect: 'http://localhost:3000/authenticate',
failureRedirect: 'http://localhost:3000/authenticate',
}),
);
server.start(
{
cors: {
credentials: true,
origin: 'http://localhost:3000',
},
},
() => console.log('Server is running on http://localhost:4000'),
);
这是我在云平台设置Google的方式有问题吗?我不知道我哪里出错了。我的回调设置正确。我不确定还能在哪里查找错误?
另一件令人困惑的事情是 GoogleStategy 是控制台记录用户配置文件和返回的访问令牌。我猜测错误是在回调路由尝试验证来自 URL 的代码时出现的。谁能指出我的方向以更好地解决这个问题?提前致谢。
我找到了适合我的解决方案,但我仍然不清楚它是否 "best-practice"。我希望有更多 GraphQL 经验的人插话。
我按照文档中的说明在前端进行身份验证:https://developers.google.com/identity/sign-in/web/backend-auth
然后我在后端写了一个名为 isAuthenticated 的查询,我可以用它来验证令牌。
async isAuthenticated(_: any, { token }) {
if(!token) {
return null;
}
const ticket = await client.verifyIdToken({
idToken: token,
audience: process.env.GOOGLE_CLIENT_ID,
});
return payload;
},
在呈现任何受保护的路由之前,我使用 React 组件检查 localStorage 中的令牌。这对我有用。