我目前正在用 Go 编写一个 API,并且一直在绞尽脑汁思考如何正确安全地进行身份验证/授权。
据我了解,事情是这样的:
- 新用户通过
api/user/register
端点(或现有用户的api/user/login
)注册帐户 - 服务器接收请求并检查用户名是否唯一等。之后,它发出(如果一切正常)一个访问 token 和刷新 token ,两者都已签名增加安全性。
- 客户端应用接收 token 并将它们存储在浏览器 cookie(或本地/ session 存储)中,并确保在对 API 的任何后续请求中通过 HTTPS 安全地发送它们。
- 当收到对 protected 路由的请求时,服务器会检查访问 token 的到期日期,如果过期,将检查刷新 token 在数据库中的有效性。如果无效,请求客户端重新认证。否则,重新颁发新的访问 token 。
我的问题是关于处理刷新 token 的步骤。
我也在编写客户端应用程序(在 React 中);我不会向公众发布 API。我只是将后端编写为客户端应用程序的 API。
- 我还应该使用刷新 token 吗?
- 我需要
api/auth/token
路由吗?我一直在阅读实现示例中的相关内容,我觉得我可以只使用一些辅助函数来查询数据库并在我的后端代码中重新发布 token ,而不必查询另一个端点来执行此操作。
很抱歉,如果他们是愚蠢的问题,但我一直在仔细阅读一页又一页详细介绍 auth 规范,一页与一页之间的细微差别让我感到困惑,不确定什么是生产中真正的“最佳实践” .
最佳答案
我认为您混淆了登录这个词。我将其称为 /api/user/authentication
,而不是 /api/user/login
。
因此,如果请求的正文附加了一个 json,它会返回一个有效的 token 。但是,如果请求获得了有效的身份验证 header ,您只需发布一个在同一时间段内有效的新 token 。这对前端特别有用,因此您可以尝试自动重新授权。
newUser := types.User{}
if r.Body != nil {
err := json.NewDecoder(r.Body).Decode(&newUser)
...
}
authHeader := r.Header.Get("Authorization")
if authHeader != "" {
_, err := USERAUTH.CHeckJWT(w,r)
if err !=nil {
...,
}
newToken := GenerateTokenFromToken(token)
}
关于API 认证流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43382539/