2017-04-13 176 views
3

我目前正在编写一个API,并且一直在困扰着我如何正确安全地进行身份验证/授权。API身份验证流程

据我了解,这是怎么一回事呢:帐户

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

我的问题是关于处理刷新标记的步骤。

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

  • 我还应该使用刷新令牌吗?
  • 我需要api/auth/token路线吗?我一直在实现示例中阅读它们,我觉得我可以只需要一些帮助函数来查询数据库并在后端代码中重新发布令牌,而不必查询另一个端点来执行此操作。

很抱歉,如果他们是愚蠢的问题,但页面后,我一直在钻研页详细介绍了身份验证规范,以及细微的差别一页一页地离开我了困惑和不确定什么是真正的“最佳实践“在生产中。

+0

您是否有一个要求/功能使得必须使用单独的刷新令牌?我无法确定你的问题会有什么。我知道一些现实世界的生产系统,但大多数没有。 –

回答

0

我觉得你对这个词的登录感到困惑。而不是/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) 
}