存储 Oauth 访问令牌和刷新令牌
Storing Oauth access token and refresh tokens
我目前正在集成一些第三方 api,他们在其中使用 oauth,而我的应用程序是 mern stack。
我目前实现的 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 以将刷新令牌保存到数据库中的用户 table,因为它只是一个按钮点击。
OAuth 流程看起来很标准 - 如果您的提供商支持,也打算使用 PKCE。
最简单的选择是使用库并将令牌存储在安全的 cookie 中,同时还要确保您使用以下强大的选项:
- 仅限 HTTP
- 安全
- AES256 加密 - 使用只有您的后端知道的对称密钥
- SameSite=严格
这可以减轻浏览器风险,使您的应用程序代码保持简单,并防止管理您自己的令牌存储所涉及的开销和风险 - 最好将此类存储留给专业的 OAuth 系统。
OAuth 令牌可能只有几 KB,因此可能需要多个 cookie 以避免超出浏览器限制。
我目前正在集成一些第三方 api,他们在其中使用 oauth,而我的应用程序是 mern stack。 我目前实现的 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 以将刷新令牌保存到数据库中的用户 table,因为它只是一个按钮点击。
OAuth 流程看起来很标准 - 如果您的提供商支持,也打算使用 PKCE。
最简单的选择是使用库并将令牌存储在安全的 cookie 中,同时还要确保您使用以下强大的选项:
- 仅限 HTTP
- 安全
- AES256 加密 - 使用只有您的后端知道的对称密钥
- SameSite=严格
这可以减轻浏览器风险,使您的应用程序代码保持简单,并防止管理您自己的令牌存储所涉及的开销和风险 - 最好将此类存储留给专业的 OAuth 系统。
OAuth 令牌可能只有几 KB,因此可能需要多个 cookie 以避免超出浏览器限制。