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 令牌端点的密码的主要内容,如果未能解决你的问题,请参考以下文章

更改密码时如何使 OAuth 令牌无效?

如何使用没有密码的spring生成oauth令牌

在 Oauth2 令牌请求 URL 中隐藏密码

需要手动创建 oAuth2 令牌,无需密码

spring 5 - Oauth2服务器获得当前用户

Spring OAuth2在发送刷新令牌时要求输入密码