API身份验证流程

时间:2017-04-13 02:24:56

标签: api security authentication go jwt

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

根据我的理解,这是怎么回事:

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

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

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

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

很抱歉,如果他们提出愚蠢的问题,但我一直在仔细阅读详细说明auth规范的页面,而且页面之间的细微差别让我感到困惑,不确定什么是真正的&# 34;最佳实践"在生产中。

1 个答案:

答案 0 :(得分:0)

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

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)
}