Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring security Oauth2资源所有者密码凭据授予_Spring_Security_Oauth_Passwords - Fatal编程技术网

Spring security Oauth2资源所有者密码凭据授予

Spring security Oauth2资源所有者密码凭据授予,spring,security,oauth,passwords,Spring,Security,Oauth,Passwords,我刚刚在EclipseIDE中安装了SpringSecurityOAuth2。我尝试实现的服务将由第二方用户通过其安装的应用程序使用,因此我选择使用密码授予类型。根据我对Oauth2的理解,以下请求应该适用于演示Sparkr2服务,而无需我编码用户名和密码参数。i、 e POST http://localhost:8080/sparklr2/oauth/token?grant_type=password&client_id=my-trusted-client&scope=trus

我刚刚在EclipseIDE中安装了SpringSecurityOAuth2。我尝试实现的服务将由第二方用户通过其安装的应用程序使用,因此我选择使用密码授予类型。根据我对Oauth2的理解,以下请求应该适用于演示Sparkr2服务,而无需我编码用户名和密码参数。i、 e

POST http://localhost:8080/sparklr2/oauth/token?grant_type=password&client_id=my-trusted-client&scope=trust&username=marissa&password=koala
但我一直在

<oauth>
<error_description>
Full authentication is required to access this resource
</error_description>
<error>unauthorized</error>
</oauth>

访问此资源需要完全身份验证
未经授权

我是否在这个请求中遗漏了什么,或者我是否需要在repo中启用什么呢?似乎Spring OAuth2不支持无秘密OAuth2客户端的密码授予类型。这可能与OAuth2规范一致,尽管该规范似乎表明并不总是需要客户端身份验证(我不太清楚)

这意味着在使用密码授予类型调用令牌端点时,需要传入客户端ID和密码(使用基本身份验证),这也意味着如果客户端没有密码,则无法使用密码授予(您可能仍然能够使用隐式流)

在Sparkr2中,
my trusted client
没有定义密码,这就是您的呼叫失败的原因

如果您想查看密码授予类型的操作,可以尝试
my trusted client with secret

curl -u my-trusted-client-with-secret:somesecret "http://localhost:8080/sparklr2/oauth/token?grant_type=password&username=marissa&password=koala"

虽然这个问题有点老了,但我想围绕这一点贡献我的发现

确实,对于SpringOAuth,您需要指定一个客户机ID才能访问令牌端点,但不必为密码授予类型指定客户机机密

接下来的几行是一个用于密码授予类型的授权服务器客户端的示例,其中没有任何客户端机密。您只需将它们添加到扩展授权服务器ConfigureRadapter的类中即可:

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {    
        clients.inMemory()
            .withClient("clientId")
            .authorizedGrantTypes("password")
            .authorities("ROLE_CLIENT")
            .scopes("read");
    }
 }
此外,确实可以避免令牌端点中的HTTP基本身份验证,并在POST调用中添加客户端id作为另一个请求参数

要实现这一点,只需将这些行添加到与前面相同的类中:

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
    oauthServer.allowFormAuthenticationForClients();
}
现在,我们可以通过这种方式调用令牌端点,这似乎更符合中的示例


我甚至尝试将客户端凭据授予类型(即curl-X POST-data)“client\u id=my trusted client&grant\u type=password&username=marissa&password=koala”)进行卷曲,但我仍然遇到相同的错误:Sparkr2项目中使用的默认客户端id和客户端机密是什么。这是我首先应该问的问题。Thanx。。。它起作用了,有很多客户证明。我尝试了“curl-u the_client:secret”和“curl-X-v-d”client\u id=the_client&client\u secret=secret&grant\u type=client\u credentials'-X POST”“,但无法解决此问题。在Sparkr中预先配置的客户端中,只有一个具有客户端\u凭据授权(我的客户端已注册重定向),但它没有密码。如果修改源代码并将“client_credentials”(客户端凭据)添加到具有机密的我的受信任客户端的authorizedGrantTypes列表中,您应该能够使用curl-u my trusted client with secret:somesecret)获取令牌。“@Christophe L我觉得spring应该支持无机密的资源所有者凭据授予。此外,对于此授予类型,规范没有强制要求必须具有客户端机密。事实上,当身份验证服务器对客户端具有隐式信任时,或者当用户或客户端未获得正确的机密凭据时,建议使用授予类型?意味着受信任的客户端应该能够获取不带密码的令牌。也似乎说它在客户端密码未发送时工作?谢谢。。我想知道如何发送获取令牌的请求
POST http://localhost:8080/sparklr2/oauth/token?grant_type=password&client_id=clientId&scope=read&username=marissa&password=koala