【问题标题】:Token based authentication for user and separate module用户和单独模块的基于令牌的身份验证
【发布时间】:2015-10-17 15:56:20
【问题描述】:

我有 2 个场景想要实现基于令牌的身份验证:

  1. 我想在用户登录时实现基于令牌的身份验证。即基于用户名和密码,用户应该获得一个令牌,并且该令牌应该用于每个请求。

  2. 我有一个独立的模块,它有 ID 和密钥。它必须以特定的时间间隔与服务器通信。我也想为此模块实现基于令牌的身份验证。

在这两种情况下,令牌都应具有以下属性:

  1. 它应该在有效载荷中。
  2. 应该有一个超时时间
  3. 当令牌过期时,服务器应该提供一个新的令牌,如果会话没有过期,则它应该注销。

OAuth 2.0 是正确的选择吗?如果有其他方法更好,请告诉我。 我应该怎么做才能解决这个问题? 将令牌放入请求-有效负载或标头中的最佳位置是哪个?为什么?

【问题讨论】:

    标签: spring spring-mvc authentication oauth spring-security


    【解决方案1】:

    OAuth 2.0 是您提到的要求的不错选择:超时时间和刷新能力。

    Stormpath 具有出色的 OAuth2.0 实现,可以为您提供开箱即用的内容。

    Stormpath 具有远程和本地 OAuth2 实现,两者均可免费使用。对于远程案例,您可以使用任何 REST 客户端 (http://docs.stormpath.com/guides/token-management/) 和我们的任何 SDK 依赖我们的后端。对于本地案例,您可以使用我们的 Servlet 插件来运行具有开箱即用 OAuth2 支持的 Web 应用程序。使用上面的文档链接,您可以找到这些资源的文档。

    例如,使用 Stormpath Spring Boot 集成,您可以执行以下操作:

    http -v --form POST http://localhost:8080/oauth/token \
    > 'Origin:http://localhost:8080' \
    > grant_type=password username=micah+demo.jsmith@stormpath.com password=<actual password>
    

    (本示例使用 httpie 与本地运行的 Spring Boot 实例进行交互)。我在上面加粗的那行符合 OAuth2.0 规范,用于使用用户名和密码进行身份验证。你得到的是这样的回应:

    HTTP/1.1 200 OK
    Cache-Control: no-store
    Content-Length: 325
    Content-Type: application/json;charset=UTF-8
    Date: Tue, 04 Aug 2015 16:02:08 GMT
    Pragma: no-cache
    Server: Apache-Coyote/1.1
    Set-Cookie: account=eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxNDQyNmQxMy1mNThiLTRhNDEtYmVkZS0wYjM0M2ZjZDFhYzAiLCJpYXQiOjE0Mzg3MDQxMjgsInN1YiI6Imh0dHBzOi8vYXBpLnN0b3JtcGF0aC5jb20vdjEvYWNjb3VudHMvNW9NNFdJM1A0eEl3cDRXaURiUmo4MCIsImV4cCI6MTQzODk2MzMyOH0.wcXrS5yGtUoewAKqoqL5JhIQ109s1FMNopL_50HR_t4; Expires=Wed, 05-Aug-2015 16:02:08 GMT; Path=/; HttpOnly
    
    {
        "access_token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxNDQyNmQxMy1mNThiLTRhNDEtYmVkZS0wYjM0M2ZjZDFhYzAiLCJpYXQiOjE0Mzg3MDQxMjgsInN1YiI6Imh0dHBzOi8vYXBpLnN0b3JtcGF0aC5jb20vdjEvYWNjb3VudHMvNW9NNFdJM1A0eEl3cDRXaURiUmo4MCIsImV4cCI6MTQzODk2MzMyOH0.wcXrS5yGtUoewAKqoqL5JhIQ109s1FMNopL_50HR_t4",
        "expires_in": 259200,
        "token_type": "Bearer"
    }
    

    这提供了一个不记名令牌,可用于后续请求以及过期。此外,它还具有作为 JWT - JSON Web Token 的优势。 JWT 经过加密签名以确保它没有被篡改,并且可以对其进行解码以向您的客户提供额外的元信息,包括用户信息、访问控制和到期时间。

    您可以使用grant_type=authorization_code 执行非常类似的操作,以使用 id 和秘密进行交互,例如您提到的独立模块。

    This article 更详细地介绍了使用 Java 进行令牌身份验证。

    完全披露:我是 Stormpath 的员工,我写了上面提到的文章。

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 2014-03-26
      • 2018-06-08
      • 2021-01-25
      • 2017-11-02
      • 2017-09-13
      • 2016-01-23
      • 2016-01-29
      • 1970-01-01
      相关资源
      最近更新 更多