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

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案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 的员工,我写了上面提到的文章。

【讨论】:

以上是关于用户和单独模块的基于令牌的身份验证的主要内容,如果未能解决你的问题,请参考以下文章

基于 Spring Security 令牌的身份验证

没有用户模型的 Django 基于令牌的身份验证

使用 Spring 和 JWT 进行基于令牌的身份验证

基于令牌的身份验证的安全性

基于令牌的身份验证和哈希密码

如何使用基于令牌的身份验证对在浏览器中输入 url 的用户进行身份验证?