如何处理身份验证系统的刷新令牌和访问令牌

问题描述 投票:0回答:1

我目前正在使用 Go 开发一个网站,后端使用 Gin 框架,前端使用 Next.js。虽然我已经实现了大部分身份验证逻辑,但我不确定如何处理访问令牌和刷新令牌。

我的计划是将刷新令牌存储在数据库中,将访问令牌存储在cookie中。但是,我对何时刷新访问令牌感到困惑。当用户收到 401 错误(表明其令牌已过期)时是否应该执行此操作?如果是这样,我应该如何处理刷新过程?

我担心的是,如果我使用过期的访问令牌刷新访问令牌,那么当过期的访问令牌被暴露时,任何获得过期令牌的人都可以获得新的令牌,从而可能允许某人获得新的访问令牌。如何安全地处理刷新过程以避免这种风险? 或者我应该使用一个计时器来刷新访问令牌,当它即将过期时? 我很感谢有关如何在这种情况下正确处理访问令牌刷新的任何指导。

我首先尝试将两个令牌存储在cookie中,然后我认为这没有意义,然后我将刷新令牌存储在数据库中,但很困惑,不知道如何根据保存在数据库中的刷新令牌刷新访问令牌

authentication cookies jwt access-token refresh-token
1个回答
0
投票

我自己已经解决了这个问题。如果对此方法有任何疑问,请告诉我。

登录后,我创建两个 JWT 令牌:刷新令牌和访问令牌。每个令牌都包含一个唯一的密钥。这些令牌存储在 cookie 中,并在数据库中创建会话。会话文档结构如下:

    type Session struct {
    ID                primitive.ObjectID `bson:"_id"`
    AccessTokenID     string             `bson:"accessTokenID" validate:"required"`
    RefreshTokenID    string             `bson:"refreshTokenID" validate:"required"`
    UsedRefreshTokens map[string]bool    `bson:"usedRefreshTokens" validate:"required"`
}

AccessTokenID 和 RefreshTokenID 保存在会话文档中。此外,还会创建一个UsedRefreshTokens对象来存储已使用的刷新令牌的ID。

在令牌刷新过程中,我检查请求中的 AccessTokenID 和 RefreshTokenID 是否与数据库中存储的相匹配。此外,我验证RefreshTokenID 是否存在于UsedRefreshTokens 对象中。如果在UsedRefreshTokens中找到RefreshTokenID,则表明存在潜在的令牌滥用(例如令牌重用),从而导致从数据库中删除会话并删除cookie。

注销时,我从数据库中删除会话并清除 cookie。

© www.soinside.com 2019 - 2024. All rights reserved.