如何在 Spring Boot 2 oauth2 中获取令牌?

Posted

技术标签:

【中文标题】如何在 Spring Boot 2 oauth2 中获取令牌?【英文标题】:How get a token in spring boot 2 oauth2? 【发布时间】:2019-05-12 06:59:54 【问题描述】:

我是 spring security oauth2 的新手。我想运行这个authorization server sample code。我成功运行它,为了获取令牌,我将邮递员设置如下,然后发送请求:

在这种情况下,我输入了带有密码的客户端 ID,但我想在没有它们的情况下登录。例如,我的用户发送用户名、密码和客户端 ID,然后获取令牌。但是我发送的每个请求,服务器都会返回 401 响应。在Spring boot 2 oauth 2,我该怎么做?

【问题讨论】:

请发布您的 WebSecurityConfigurerAdapter 和 AuthorizationServerConfigurerAdapter WebSecurityConfigurerAdapter 和 AuthorizationServerConfigurerAdapter。 在此处发布您的 401 响应邮递员屏幕截图 "timestamp": "2018 ...", "status": 401, "error": "Unauthorized", "message": "Unauthorized", "path": "/oauth/令牌” but i want to login without theme 是什么意思? 【参考方案1】:

1) 要获取访问令牌,您必须使用这样的请求:

curl --user client:secret \
  -X POST http://localhost:8080/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=password&username=username&password=password&scope=*" \

使用 Basic Auth 和您的应用程序凭据(如果您愿意,您可以避免使用秘密)。您必须在请求正文中传递的用户名及其密码以及 grant_type 字段中的“密码”值。

作为响应,您将获得访问和刷新令牌,例如:


    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2VtYWlsIjoidXNlckBtYWlsLmNvbSIsInVzZXJfbmFtZSI6InVzZXIiLCJzY29wZSI6WyIqIl0sImV4cCI6MTU0Nzc2NDIzOCwiYXV0aG9yaXRpZXMiOlsiQURNSU4iXSwianRpIjoiYzk1YzkzYTAtMThmOC00OGZjLWEzZGUtNWVmY2Y1YWIxMGE5IiwiY2xpZW50X2lkIjoiY2xpZW50In0.RWSGMC0w8tNafT28i2GLTnPnIiXfAlCdydEsNNZK-Lw",
    "token_type": "bearer",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2VtYWlsIjoidXNlckBtYWlsLmNvbSIsInVzZXJfbmFtZSI6InVzZXIiLCJzY29wZSI6WyIqIl0sImF0aSI6ImM5NWM5M2EwLTE4ZjgtNDhmYy1hM2RlLTVlZmNmNWFiMTBhOSIsImV4cCI6MTU0Nzc2NzcxOCwiYXV0aG9yaXRpZXMiOlsiQURNSU4iXSwianRpIjoiZDRhNGU2ZjUtNDY2Mi00NGZkLWI0ZDgtZWE5OWRkMDJkYWI2IiwiY2xpZW50X2lkIjoiY2xpZW50In0.m7XvxwuPiTnPaQXAptLfi3CxN3imfQCVKyjmMCIPAVM",
    "expires_in": 119,
    "scope": "*"
    "jti": "c95c93a0-18f8-48fc-a3de-5efcf5ab10a9"

2) 然后您可以使用该访问令牌访问您的服务器应用程序的资源。在这种情况下,您需要 Bearer Token 身份验证类型和您的访问令牌:

curl -X GET http://localhost:8080/demo \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2VtYWlsIjoidXNlckBtYWlsLmNvbSIsInVzZXJfbmFtZSI6InVzZXIiLCJzY29wZSI6WyIqIl0sImV4cCI6MTU0Nzc2NDIzOCwiYXV0aG9yaXRpZXMiOlsiQURNSU4iXSwianRpIjoiYzk1YzkzYTAtMThmOC00OGZjLWEzZGUtNWVmY2Y1YWIxMGE5IiwiY2xpZW50X2lkIjoiY2xpZW50In0.RWSGMC0w8tNafT28i2GLTnPnIiXfAlCdydEsNNZK-Lw'

3) 要刷新令牌,您必须再次使用带有客户端凭据的基本身份验证,但在这种情况下,您需要 'refresh_token' 作为grant_type

curl --user client:secret \
  -X POST http://localhost:8080/oauth/token \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=refresh_token&scope=*&refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2VtYWlsIjoidXNlckBtYWlsLmNvbSIsInVzZXJfbmFtZSI6InVzZXIiLCJzY29wZSI6WyIqIl0sImF0aSI6ImM5NWM5M2EwLTE4ZjgtNDhmYy1hM2RlLTVlZmNmNWFiMTBhOSIsImV4cCI6MTU0Nzc2NzcxOCwiYXV0aG9yaXRpZXMiOlsiQURNSU4iXSwianRpIjoiZDRhNGU2ZjUtNDY2Mi00NGZkLWI0ZDgtZWE5OWRkMDJkYWI2IiwiY2xpZW50X2lkIjoiY2xpZW50In0.m7XvxwuPiTnPaQXAptLfi3CxN3imfQCVKyjmMCIPAVM'

每次访问令牌过期时,您都必须使用第三个请求刷新它。然后您将能够再次访问资源。

其他信息

1) 我对how to build the simple OAuth2 app with JWT and custom claims的回答

2) Related demo application

3)Related Postman collection

【讨论】:

【参考方案2】:

OAuth 2.0 规范描述了客户端应用程序获取访问令牌(代表用户对客户端访问其数据的权限)的许多授权(“方法”)。

Spring OAuth2 预定义的授权类型:

ClientCredentialsTokenGranter RefreshTokenGranter AuthorizationCodeTokenGranter ImplicitTokenGranter ResourceOwnerPasswordTokenGranter(您在示例中使用的密码授予类型)

如果您想更改令牌获取逻辑,您可以使用自定义 TokenGranter

补充:

OAuth 2 Develpers Guide

【讨论】:

以上是关于如何在 Spring Boot 2 oauth2 中获取令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 2.x 中将 CORS 添加到 oauth2/resource 服务器?

如何将 oAuth2.0 与 Spring boot 1.5.8.RELEASE 集成

Spring Boot 和 OAuth2 社交登录,无法获取 refreshToken

Spring Boot OAuth2:如何检索用户令牌信息详细信息

如何使用spring-boot 1.3.0.RC1为oauth2提供自定义安全性配置

使用 spring-boot OAuth2 服务器保护的 Spring-boot 应用程序