InvalidGrantException,运行2 Spring OAuth Server

时间:2016-03-04 06:49:21

标签: java spring spring-security oauth

有两个服务。我正在使用Netflix堆栈[Eureka / zuul]。

  1. AGGREGATOR-SERVICE
  2. USER-SERVICE [Spring OAUTH]
  3. 当我运行一个用户服务实例时一切正常但是当我在另一台服务器上运行另一个实例时,我收到下面提到的错误并且请求[login oauth]失败。

    我想扩展使用spring oauth的USER-SERVICE。

      

    处理错误:InvalidGrantException,无效的授权码:   Q1j7Hs 06:24:17.253 [http-nio-8081-exec-2]信息   o.s.s.o.p.e.TokenEndpoint - 处理错误:InvalidGrantException,   授权码无效:w9uvl1

    任何线索或建议都将受到赞赏。

2 个答案:

答案 0 :(得分:3)

配置AuthorizationServerConfiguration以使用JdbcAuthorizationCodeServices服务在所有身份验证节点之间通过数据库存储和共享授权码。

@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter implements EnvironmentAware {

    @Inject
    private DataSource dataSource;

    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource);
    }

    // JdbcAuthorizationCodeServices stores authentication codes in a database.
    @Bean
    public JdbcAuthorizationCodeServices jdbcAuthorizationCodeServices() {
        return new JdbcAuthorizationCodeServices(dataSource);
    }

    @Inject
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
            .tokenStore(tokenStore())
            .reuseRefreshTokens(false)
            .authenticationManager(authenticationManager)
            .authorizationCodeServices(jdbcAuthorizationCodeServices());
    }
}

并创建oauth_code表:

CREATE TABLE oauth_code (
    code VARCHAR(256), authentication LONGVARBINARY
);

答案 1 :(得分:0)

如果您有两个实例,则必须注意,一个客户端始终与同一实例进行通信。否则,客户端可能会向实例A发出第一个请求,并进一步请求实例B.

Normaly在这种情况下,客户端连接到负载均衡器,转发到您的服务实例。

比你必须选择:

  1. 将负载均衡器配置为始终将客户端连接到同一个实例,这是通过粘性会话完成的。
  2. 让实例分享他们的会话,例如在reddis商店 见spring session