oauth 令牌端点的密码
Posted
技术标签:
【中文标题】oauth 令牌端点的密码【英文标题】:password for oauth token endpoint 【发布时间】:2014-08-28 11:40:00 【问题描述】:我正在尝试将 OAuth 添加到我正在使用 Spring 框架开发的休息服务中。我正在使用基于注释的配置和 spring-boot 来让它运行。
我的项目中有以下课程:
@Configuration
@EnableWebSecurity
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecuritySettings extends WebSecurityConfigurerAdapter
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
auth.inMemoryAuthentication()
.withUser("admin").password("123").authorities("ROLE_USER");
@Override
protected void configure(HttpSecurity http) throws Exception
http.authorizeRequests().anyRequest().authenticated()
.and().httpBasic().and().csrf().disable();
而我的授权服务器配置如下:
@Configuration
@EnableAuthorizationServer
public static class MyAuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception
clients.inMemory().withClient("web")
.authorizedGrantTypes("password")
.authorities("ROLE_CLIENT","ROLE_TRUSTED_CLIENT","ROLE_USER")
.scopes("read", "write")
.resourceIds(RESOURCE_ID);
当我向/oauth/token/
端点发出 GET 请求时,我被要求输入 HTTP 基本凭据。当我尝试使用admin
用户登录时,会记录以下内容
o.s.s.o.provider.endpoint.TokenEndpoint : Handling error: NoSuchClientException, No client with requested id: admin
输入用户名web
有效,但我不知道密码。记录了默认密码,但它也不起作用。
Using default security password: f23087f8-58ce-e3d-bc62-58bf0963e75c
那么这个密码是什么?我在哪里可以找到它?如何设置?
【问题讨论】:
【参考方案1】:您使用的 API 来自 this builder class。
客户端应用程序使用令牌端点来请求资源的访问令牌。浏览器最终用户不使用它。 OAuth2 客户端通常被分配一个“客户端密码”,它们可以用来在端点进行身份验证,通常使用基本身份验证,如 in the OAuth 2.0 spec 所述。
因此,要回答您的具体问题,您将使用构建器 API 上的“秘密”方法,并使用该值作为客户端进行身份验证:
clients.inMemory().withClient("web")
.authorizedGrantTypes("password")
.secret("webclientsecret")
...
此外,“密码”授权意味着客户端请求令牌using an end users ID and password,只是为了确保这是您真正想要的。和这里的密码问题无关。
【讨论】:
嗨!谢谢回复。你是对的,这正是我在这里想要实现的。我只使用浏览器来尝试用户名/密码组合。我实际上已经阅读了您之前链接的页面。文档中的示例请求发送了一个Authorization
标头,因此在我的情况下,它应该类似于Basic encode64(web:webclientsecret)
。我对么?我仍然无法让它工作。
我终于让它工作了。我接受您的回答,因为它确实回答了我的要求,因此我可以隔离问题。
我在研究另一个与 Spring OAuth2 中客户端定义相关的问题时找到了您的答案。你愿意发表评论吗?这是链接:***.com/questions/36899386/…【参考方案2】:
这是 OAuth 访问令牌。它基于用户登录名和密码,用于访问受保护的资源。 URL“/oauth/token”用于获取访问令牌而不是可用的请求令牌。这个请求是基于 Request Token secret 进行数字签名的。
Oauth 协议以这种方式使用此访问令牌:
Application-Consumer 获取请求令牌。
用户被重定向到服务提供商的站点并在那里授权请求令牌。 (如果通过Http basic进行授权,那么你应该添加名称为“Authorization”和值为“Basic EncodeBase64(“name:password”)”的请求头,其中EncodeBase64是一个函数,“name”和“password”是用户名和用户密码。
应用-消费者在访问令牌上交换请求令牌。
Application-Consumer 向服务的 API 发送授权请求。
您无法在OAuth 2 Developers Guide 和Spring Social Reference 中找到更多信息
我希望你已经得到了你的问题的答案(或者更接近它)。 =)
【讨论】:
感谢您的回复。我实际上是通过使用here 中的grant_type: 密码向令牌端点发出一个post 请求。用户名是admin
,用户密码是123
,我要在授权请求标头中编码的内容是Authorization: Basic [X]
,其中X是web:clientsecret
对的编码值。我对吗?我在这里缺少什么?这些密码都不起作用。我总是得到error: "Unauthorized" message: "Bad credentials"
以上是关于oauth 令牌端点的密码的主要内容,如果未能解决你的问题,请参考以下文章