单点登录的Spring Oauth2 ResourceOwnerPassword流程

时间:2016-01-20 19:35:26

标签: spring spring-security oauth-2.0 spring-boot spring-security-oauth2

我有一个oauth Authserver应用程序,一个网络应用程序(启用oauth sso),一个Android应用程序(需要访问网络应用程序中的其余资源)

我正在尝试使用oauth-vanilla(最新的没有jwt)spring boot示例项目来实现spring-oauth2。该项目具有以下客户端配置

security.oauth2.client.clientId: acme
security.oauth2.client.clientSecret: acmesecret
security.oauth2.client.authorized-grant-types: authorization_code,refresh_token,password
security.oauth2.client.scope: openid

所以逻辑流程就像(纠正我错了)用户尝试访问ui app - > zuul proxied redirect(带有客户端详细信息)到认证服务器 - >登录凭证(protected / authorize url) ) - >授权范围 - >返回令牌/授权码。

如何消除用户授权步骤(对于Android应用目的,我想要资源所有者apporach)。我改变了我的客户端配置,如下所示

clients.inMemory().withClient("****").secret("*****").authorities("ROLE_USER")
                .authorizedGrantTypes("password", "refresh_token").scopes("read", "write");

但我从authserver应用程序收到错误( DefaultRedirectResolver.java

  

" redirect_uri只能由implicit或authorization_code使用   授予类型。"

如果我的web-ui应用程序中有我的security.oauth属性

security:
  oauth2:    
    client:
      accessTokenUri: http://localhost:9097/uaa/oauth/token
      userAuthorizationUri: http://localhost:9097/uaa/oauth/authorize
      clientId: ****
      clientSecret: ****
    resource:
      userInfoUri: http://localhost:9097/uaa/user

单点登录,是否可以使用资源所有者密码方法?如果是这样,我应该在配置中改变什么?

2 个答案:

答案 0 :(得分:2)

  

“redirect_uri只能由implicit或authorization_code使用   授予类型。“

我不确定“redirect_uri”,但我认为你无法通过密码流进行单点登录。通过在授权服务器上创建会话来实现SSO,以便如果授权服务器已经具有经过身份验证的会话,则客户端(相同或不同)将不必再次进行身份验证。密码流不会在身份验证服务器上创建会话......它只会获取令牌。

答案 1 :(得分:0)

您必须在.authorizedGrantTypes()上指定authorization_codeimplicit授予类型,因为它们也是 重定向类型

clients.inMemory().withClient("****").secret("*****").authorities("ROLE_USER")
.authorizedGrantTypes("authorization_code", "password", "refresh_token").scopes("read", "write");

clients.inMemory().withClient("****").secret("*****").authorities("ROLE_USER")
.authorizedGrantTypes("implicit", "password", "refresh_token").scopes("read", "write");

来源: DefautlRedirectResolver