【问题标题】:how to handle expiring access token from partner api如何处理来自合作伙伴 api 的过期访问令牌
【发布时间】:2022-06-18 20:40:02
【问题描述】:

我是 Next js 的新手。我确定这是一个常见问题,但我不知道要搜索什么。这是一个大纲:

我的一个合作伙伴有一个带有 Bearer auth 的 API。 Bearer 令牌来自我用我的用户名和密码调用的端点 (/auth)。该端点返回我用于所有其他端点的 Bearer 令牌,但它会在一天后过期。

我将如何处理对该合作伙伴的 Next.js API 路由上的 API 调用? IE。我将把这个访问令牌存储在哪里,这样每个 API 路由就不需要不断地获取它。还有,过期了怎么更新?

【问题讨论】:

    标签: next.js access-token


    【解决方案1】:

    您的客户(一旦通过身份验证)应该是“存储”这些令牌的客户。您基本上需要从客户端的会话、cookie 中获取它,或者您正在存储它们。

    就更新这些令牌而言,您的身份验证提供程序还应提供一个“刷新令牌”,可用于在新 jwt 过期后检索它。此处的目的是您将能够为用户刷新令牌,而无需他们再次登录。

    根据您的提供商,这可能是您需要调用的新端点。

    https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/

    【讨论】:

    • 嗨,正如我所提到的,我在充当 webhook 的 Next API 路由中执行此操作。不确定我是否可以访问客户端的浏览器或类似的东西......也许我错过了一些东西。
    【解决方案2】:

    如果您在前往特定路线(例如受保护的路线)时调用合作伙伴的 api,那么您应该将访问令牌存储为带有 h​​ttp-only 标志的 cookie,以避免安全问题,例如可以窃取的 xss 攻击来自您的浏览器的会话数据(当他发送带有令牌的响应时,应该在您的合作伙伴的 api 中的 /auth 路由中设置 http-only 标志),所以在 getServerSideProps 将 cookie 与请求一起发送,因此您的合作伙伴应从 cookie 中获取令牌并验证它以允许请求,我需要指出的一件事是您无法访问仅限 http 的 cookie从客户端,但是当您使用 nextJs 时,您仍然可以使用名为 nookies 的库从 getServerSideProps 访问它,因此您可以执行以下操作:

    export const getServerSideProps: GetServerSideProps = async ctx => {
      const cookies = nookies.get(ctx)
      const someApiData = await fetchApiData(cookies)
    
      if (!someApiData) {
        return {
          redirect: {
            // Redirect to home if not authorized
            destination: '/',
            permanent: false
          }
        }
      }
    
      return {
      //return data fetched from the api
        props: {
          someApiData
        }
      }
    }
    

    以及进行 api 调用的函数可能如下所示(注意我使用的是 axios):

    const fetchApiData = async (cookies: CookieData) => {
      try {
        const result = await axios.get<ApiData>('/some/api/route', {
          // Pay attention to this line, here we are sending the cookie with the access token
          headers: {
            Cookie: `token=${cookies.token}; HttpOnly;`
          }
        })
        return result.data
      } catch (error) {
        console.log(error)
      }
    }
    

    请注意,每当您向受保护的路由发出请求时,您都应发送 cookie,并且您的合作伙伴应在他想要保护的每个路由中验证此令牌。 并且要在不再次登录的情况下刷新令牌,您的合作伙伴可以实现像 @Slee 提到的刷新令牌。这只是一个例子,但你明白了。

    【讨论】:

    • 您好,如上所述,当合作伙伴 API ping 我的 webhook(这是下一个 js api 路由)时,我正在调用。我不确定我是否可以访问 cookie?谢谢你的回答。
    • 我很确定这是可能的,也许你正在寻找的是iron session,使用这个库你可以从你的 nextJs api 创建一个会话,这样你就可以将令牌存储在会话中并进一步将其返回以与请求一起发送,尽管没有任何代码很难知道它是否适用于您的情况,因此如果您需要更多帮助,请包含一些代码
    【解决方案3】:

    @Rahul Rentash 你找到这个问题的解决方案了吗?

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      相关资源
      最近更新 更多