Passport (oAuth2) 如何与 GraphQL (TypeGraphQL) 一起使用?

Posted

技术标签:

【中文标题】Passport (oAuth2) 如何与 GraphQL (TypeGraphQL) 一起使用?【英文标题】:How does Passport (oAuth2) work with GraphQL (TypeGraphQL)? 【发布时间】:2020-01-09 09:25:07 【问题描述】:

我正在尝试使用 Google 策略。

我的目标是让用户通过仅通过 Google 登录进行身份验证来访问 React Next.js 应用程序的受限区域。这是基于他们的电子邮件扩展名为 @SpecificDomain.com。

我在前端有一个组件,它打开一个 Google 登录窗口并返回带有访问令牌的对象。据我了解,然后我将此对象转发到我自己的后端(Apollo 服务器,TypeGraphQL 配置)。

我的 ApolloServer 实例如下所示:

onst apolloServer = new ApolloServer( schema,
context: async ( req) => 
    let token = null;
    let currentUser = null;

    try
      token = req.headers.authorization;

      if(token)
        currentUser = await authenticate(token);
      
     catch (error) 
      console.warn(`Unable to authenticate using auth token: $token`);
    

    return 
      currentUser,
      token
    



 ) as any;

在上下文中,我尝试通过将令牌发送到另一个组件来验证用户访问令牌,在该组件中我尝试使用 Passport,该组件使用 Google oauth2 策略来验证用户。

但是,我在网上看到的所有示例都使用 Express 中间件。我想知道是否有任何方法可以仅使用 GraphQL 来做到这一点?

我不明白我是怎么称呼这个的:

    passport.use(new GoogleStrategy(
  clientID: googleCredentials.CLIENT_ID,
  clientSecret: googleCredentials.CLIENT_SECRET,
  callbackURL: googleCredentials.redirect_uris[0]
,
function(accessToken : string, cb : any, refreshToken? : string, profile? : string) 
  const userOject = accessToken, refreshToken, profile;
  return cb(null, userOject);

));

如何将令牌传递给它?

我也试过了,

   export default function authenticateUser(token : string) 
  passport.authenticate('oauth2');


但是 passport.authenticate 没有任何令牌参数。

有人可以给我一些指点或指出正确的方法吗?

感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

决定使用 Express 来处理身份验证。

【讨论】:

以上是关于Passport (oAuth2) 如何与 GraphQL (TypeGraphQL) 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Passport.js 的 Vue.js 客户端和 Express.js 服务器的完整 Oauth2 身份验证流程

Node、Express、Oauth2 和 Passport 的 Angularjs CORS 问题

使用 Passport 和 OAuth2 + 社交网络的 NodeJS REST 身份验证

Laravel OAuth2 Passport API,生成令牌但无法发出请求:“未经身份验证”

将 Laravel Passport 与移动应用程序一起使用

如何在 Azure 上部署和运行 Passport Express 节点