API 身份验证流程

Posted

技术标签:

【中文标题】API 身份验证流程【英文标题】:API Authentication flow 【发布时间】:2017-09-09 00:02:37 【问题描述】:

我目前正在用 Go 编写一个 API,并且一直在思考如何正确、安全地进行身份验证/授权。

据我了解,事情是这样的:

新用户通过api/user/register 端点(或api/user/login 现有用户)注册帐户 服务器接收请求并检查用户名是否唯一等。之后,它会发出(如果一切正常)访问令牌刷新令牌,两者都已签名增加了安全性。 客户端应用接收令牌并将它们存储在浏览器 cookie(或本地/会话存储)中,并确保在任何后续对 API 的请求中通过 HTTPS 安全地发送它们。 当接收到对受保护路由的请求时,服务器会检查访问令牌的过期日期,如果过期,将检查数据库中刷新令牌的有效性。如果无效,请求重新认证客户端。否则,请重新颁发新的访问令牌。

我的问题是关于处理刷新令牌的步骤。

我也在编写客户端应用程序(在 React 中);我不会向公众发布 API。我只是将后端编写为客户端应用程序的 API。

我还应该使用刷新令牌吗? 我需要api/auth/token 路由吗?我在实现示例中不断阅读它们,我觉得我可以只使用一些辅助函数来查询数据库并在我的后端代码中重新发出令牌,而不必查询另一个端点来这样做。

对不起,如果他们是愚蠢的问题,但我一直在仔细研究详细说明身份验证规范的页面,页面之间的细微差异让我感到困惑,不确定什么是生产中真正的“最佳实践” .

【问题讨论】:

您是否有需要单独刷新令牌的要求/功能?我无法确定您的问题中的任何内容。我知道一些现实世界的生产系统有,但大多数没有。 【参考方案1】:

我认为您对登录一词感到困惑。而不是/api/user/login,我称之为/api/user/authentication。 因此,如果请求的主体附加了一个 json,它会返回一个有效的令牌。但是,如果请求获得了有效的身份验证标头,您只需发出一个在同一时间段内有效的新令牌。这对前端特别有用,因此您可以尝试自动重新验证。

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 身份验证流程的主要内容,如果未能解决你的问题,请参考以下文章

Spotify 身份验证流程 (Spotify API)

如何注销 Spotify API 身份验证流程演示

Google APi + Passport + React:身份验证流程

REST API 上的用户注册/身份验证流程

Instagram API:范围是不是适用于 OAuth2 隐式身份验证流程?

常用中间件 vs 身份验证 api