16

新しい 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 サーバーを外部アクセスから保護する必要があります。

クライアント資格情報フロー全体またはスプリングセキュリティの適用について誤解があるように見えるので、明確化していただければ幸いです。

4

1 に答える 1

19

認可サーバーに対してクライアントを認証していません。

次のようなことをする必要があります:

curl --user the_client:secret --data "grant_type=client_credentials" http://localhost:9090/oauth/token

これは、認可サーバーに対してクライアントを認証してから、grant_type およびその他のパラメーターを指定することです。これにより、oauth クライアントの詳細によって決定されるスコープを持つ「bearer」タイプのアクセス トークンが返されます。トークンを取得したら、Authorization ヘッダーを設定して、保護されたリソースにアクセスできます。

curl -H "Authorization: Bearer <accessToken>" <resourceUrl>
于 2013-01-03T16:59:52.267 に答える