存储 Oauth 访问令牌和刷新令牌

时间:2021-07-01 18:20:14

标签: node.js reactjs oauth-2.0 access-token refresh-token

我目前正在集成一些使用 oauth 的第三方 api,我的应用程序是 mern 堆栈。 我目前实现的 oauth 流程仅发生在后端,这是我的代码示例。

当用户点击一个按钮从客户端进行身份验证时,我处理来自服务器的重定向

export const getAuthCode = async (req: Request, res: Response): Promise<void> => {
  res.redirect(OAUTH_URL)
}

当第三方 api 重定向时,我解析出代码并请求访问和刷新令牌

export const getAccessAndRefreshToken = async (req: Request, res: Response): Promise<void> => {
  const { code } = req.query

  try {
    // *options contain client, secret, redirect uri and code*
    const { data } = await axios.post(OAUTH_URL, options)

    console.log(data) // *contains access and refresh tokens*

    // save access and refresh token to httponly cookie
    // redirect user

  } catch (err) {
    console.log(err)
  }
}

问题 1 - 这是实现 oauth 流程的正确方法吗?

问题 2 - 如何存储访问和刷新令牌?目前我在 httpOnly cookie 中设置了访问和刷新令牌,我无法从客户端将用户 ID 发送到 getAuthCode 以将刷新令牌保存到数据库中的用户表中,因为它只是一个按钮点击。

1 个答案:

答案 0 :(得分:1)

  1. OAuth 流程看起来非常标准 - 如果您的提供商支持,还打算使用 PKCE

  2. 最简单的选择是使用库并将令牌存储在安全 cookie 中,同时还要确保您使用以下强选项:

  • 仅限 HTTP
  • 安全
  • AES256 加密 - 使用只有您的后端知道的对称密钥
  • SameSite=strict

这可以降低浏览器风险,使您的应用程序代码保持简单,并防止管理您自己的令牌存储所涉及的开销和风险 - 最好将这种类型的存储留给专业的 OAuth 系统。

OAuth 令牌可能只有几 KB,因此可能需要多个 cookie 以避免超出浏览器限制。