基于令牌的用户和单独模块的身份验证

时间:2015-07-27 12:47:41

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

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

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

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

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

    1. 应该是有效载荷。
    2. 应该有一个超时期限
    3. 当令牌过期时,服务器应提供新令牌,如果会话未过期,则应该注销。
    4. OAuth 2.0是正确的选择吗?如果有任何其他方法更好,请告诉我。 我该怎么做才能解决这个问题? 哪个是将令牌放入请求-Payload或标头的最佳位置?为什么?

1 个答案:

答案 0 :(得分:0)

对于您提到的要求,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令牌的优势。 JWT经过加密签名,以确保它没有被篡改,并且可以对其进行解码以向您的客户提供其他元信息,包括用户信息,访问控制和到期。

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

This article详细介绍了使用Java进行令牌认证。

完全披露:我是一名Stormpath员工,我写了上面引用的文章。