web-dev-qa-db-ja.com

Spring Security OAuth2 check_tokenエンドポイント

Spring Security OAuthを使用して、別の承認サーバーと連携するようにリソースサーバーをセットアップしようとしています。 /check_tokenエンドポイントが必要なRemoteTokenServicesを使用しています。

/oauth/check_tokenを使用すると、@EnableAuthorizationServerエンドポイントがデフォルトで有効になることがわかりました。ただし、デフォルトではエンドポイントにアクセスできません。

このエンドポイントをホワイトリストに登録するには、次のエントリを手動で追加する必要がありますか?

http.authorizeRequests().antMatchers("/oauth/check_token").permitAll();

これにより、すべてのユーザーがこのエンドポイントにアクセスできるようになります。これは望ましい動作ですか?それとも何か不足していますか?.

前もって感謝します、

18
sowdri

必ず

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception
{
   oauthServer.checkTokenAccess("permitAll()");    
}

この詳細については::

RemoteTokenServiceの使用方法

20
Pratik Shah

いくつかの点を明確にし、Pratik Shah(および関連スレッドのAlex):

1-言及したconfigureメソッドは、AuthorizationServerConfigurerAdapterを拡張するクラスを作成することによってオーバーライドされます。

_    @EnableAuthorizationServer
    @Configuration
    public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {

        @Override
        public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
            oauthServer.tokenKeyAccess("permitAll()")
                .checkTokenAccess("isAuthenticated()");
        }

        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws     Exception {
            clients
                    .inMemory()
                    .withClient("ger-client-id")
                    .secret("ger-secret")
                    .authorizedGrantTypes("password")
                    .scopes("read", "write");
        }
    }
_

2- AuthorizationServerConfigurer Beanを含む_@EnableAuthorizationServer_アノテーションを含めるときに、Spring Bootによって実行される自動構成を説明する このSpringガイド を読むことをお勧めします。上記のようにAuthorizationServerConfigurerAdapterを拡張する構成Beanを作成すると、自動構成全体が無効になります。

3-自動構成が適切であり、_/oauth/check_token_エンドポイントへのアクセスを操作したいだけの場合は、AuthorizationServerConfigurer Beanを作成せずに(したがって、構成する必要なく)実行できます。プログラム的にすべて)。

_security.oauth2.authorization.check-token-access_ファイルに_application.properties_プロパティを追加する必要があります。次に例を示します。

_security.oauth2.client.client-id=ger-client-id
security.oauth2.client.client-secret=ger-secret
security.oauth2.client.scope=read,write

security.oauth2.authorization.check-token-access=permitAll()
_

もちろん、必要に応じてisAuthenticated()値を指定できます。

ログレベルをDEBUGに設定して、すべてが期待どおりに構成されていることを確認できます。

_16:16:42.763 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'permitAll()', for Ant [pattern='/oauth/check_token']
_

これらのプロパティに関するドキュメントはあまりありませんが、 この自動構成クラス から把握できます。

最後に言及する価値があることの1つは、最新のSpringバージョンでは修正されているようですが、 問題spring-security-oauth 事業;リクエストに末尾のスラッシュを追加すると、token_check機能がデフォルトで有効になるようです。

_$ curl localhost:8080/oauth/check_token/?token=fc9e4ad4-d6e8-4f57-b67e-c0285dcdeb58
{"scope":["read","write"],"active":true,"exp":1544940147,"authorities":["ROLE_USER"],"client_id":"ger-client-id"}
_
6
Gerardo Roza

まず、構成トークンアクセス式:

@Override
public void configure(AuthorizationServerSecurityConfigurer securityConfigurer) throws Exception {
    securityConfigurer
            .allowFormAuthenticationForClients()
            .checkTokenAccess("isAuthenticated()")
            .addTokenEndpointAuthenticationFilter(checkTokenEndpointFilter());
}

次に、クライアント認証を処理するフィルターを定義する必要があります。

@Bean
public ClientCredentialsTokenEndpointFilter checkTokenEndpointFilter() {
    ClientCredentialsTokenEndpointFilter filter = new ClientCredentialsTokenEndpointFilter("/oauth/check_token");
    filter.setAuthenticationManager(authenticationManager);
    filter.setAllowOnlyPost(true);
    return filter;
}
0
smartwjw