新しい REST サーバーと既存のクライアント アプリの間のクライアント資格情報フローを理解し、実装しようとしています。このように spring-security OAuth2 をセットアップしました。これまでの私の理解では、サーバーは次の要求をサポートする必要があります。
$ curl -X -v -d 'client_id=the_client&client_secret=secret&grant_type=client_credentials' -X POST "http://localhost:9090/oauth/token"
しかし、私は得る
InsufficientAuthenticationException: There is no client authentication
Principal
ここにいることが原因null
です(スプリングセキュリティコード):
@FrameworkEndpoint
@RequestMapping(value = "/oauth/token")
public class TokenEndpoint extends AbstractEndpoint {
@RequestMapping
public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal,
@RequestParam("grant_type") String grantType, @RequestParam Map<String, String> parameters) {
if (!(principal instanceof Authentication)) {
throw new InsufficientAuthenticationException(
そのため、最初にサーバーに対して認証する必要があるようです。しかし、それは私がやりたいことではありません。共有シークレットを使用して、2 つのサーバーが相互に通信できるようにします。OAuth プロバイダー サーバーは、クライアント サーバーがそのトークンを使用してサーバー上のすべての REST リソースにアクセスできるように、要求に応じて (信頼できる) クライアント サーバーにアクセス トークンを提供する必要があります。これにより、REST リソースが外部アクセスから保護されます。
後で、選択したリソースをサード パーティに提供し、最終的にはサーバー間の通信にもきめ細かいセキュリティを実装したいと考えています。しかし今のところ、REST サーバーを外部アクセスから保護する必要があります。
クライアント資格情報フロー全体またはスプリングセキュリティの適用について誤解があるように見えるので、明確化していただければ幸いです。