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



我目前正在集成一些第三方api,他们使用oauth,我的应用程序是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中设置了访问和刷新令牌,我无法从客户端向getAuthCode发送用户id以将刷新令牌保存到数据库中的用户表中,因为这只是一个按钮点击。

  1. OAuth流看起来很标准-如果您的提供商支持,也可以使用PKCE。

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

  • 仅HTTP
  • 安全
  • AES256加密-使用仅由后端知道的对称密钥
  • SameSite=严格

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

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

最新更新