使用 next-auth 时,如何从浏览器调用我的 Cognito 安全 Rest API?

Posted

技术标签:

【中文标题】使用 next-auth 时,如何从浏览器调用我的 Cognito 安全 Rest API?【英文标题】:How do I call my Cognito secured RestAPI from the browser when using next-auth? 【发布时间】:2022-01-19 17:18:30 【问题描述】:

我有一个由AWS Cognito 保护的AWS RestApi。除此之外,我还有一个使用 next-auth 的 NextJS 应用程序,它提供针对 Cognito 用户池的用户身份验证。

我现在想直接从浏览器调用 RestApi,但找不到包含正确凭据的方法。由于我的网络应用程序中存在的唯一 cookie 以 next-auth- 开头,我认为它们不适合该任务。

那么,如何从浏览器访问访问令牌?

【问题讨论】:

【参考方案1】:

我最终在 NextAuth 配置中连接了两个回调,如下所示:

NextAuth(
    providers: [
      CognitoProvider(
        idToken: true,
        issuer,
        clientSecret,
        clientId,
        authorization,
      ),
    ],
    callbacks: 
      session: async function ( session, token ) 
        return 
          ...session,
          bearerToken: token.bearerToken ?? session.bearerToken,
        ;
      ,
      async jwt( token, account ) 
        token.bearerToken = account?.id_token ?? token.bearerToken;
        return token;
      ,
    ,
  )

来自pages/api/auth/[...nextauth].ts 文件。

这使得bearerToken 可以通过getSession 调用获得:

import  getSession  from "next-auth/react";

...

const  bearerToken  = await getSession();

【讨论】:

【参考方案2】:

您可以使用 Postman 之类的应用程序来传递 Authorization 标头。我不确定您的查询是关于获取访问令牌还是关于如何使用访问令牌。

为了获取访问令牌然后调用您的 REST API,您需要有一个服务器。假设您的服务器的域名为“example.com”。然后,将此服务器名称放入您的 Cognito 用户池应用程序客户端的回调 URL 中。

用户认证后,Cognito 会将访问令牌发送到“example.com”。然后,您的服务器将有责任使用 Cognito 提供的访问或 ID 令牌正确调用 REST API。

出于测试目的,您可以在使用 Cognito 进行身份验证后手动获取访问令牌。然后,您可以使用 Postman 等应用程序使用访问令牌对您的 REST API 端点进行 HTTP 调用。将令牌作为值放入授权标头。

【讨论】:

对不起,不是我想要完成的。还是谢谢!

以上是关于使用 next-auth 时,如何从浏览器调用我的 Cognito 安全 Rest API?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Next-Auth 进行身份验证时如何修复内部服务器错误

如何使用具有永恒 API 的 Next-auth 凭证提供程序

如何从请求中解析 JWT 令牌 [Next-Auth]

如何在 nextjs 组件中使用 next-auth?

如何使用 next-auth 获取额外的范围数据?

Next-auth - 如何更新会话客户端?