2017-01-04 7 views
1

この質問は実際にはthisの私の質問の連続的な質問です。私は認証コードフローを使用してIdentityserver4からaccess_tokenとid_tokenを取得しようとしています。IdentityServer4の認証エンドポイントからaccess_token、id_tokenを取得するにはどうすればよいですか?

しかし、「認証」エンドポイントにアクセスしようとすると、405(メソッドは許可されません)HTTPエラーが発生します。

HTTP GETリクエスト

http://localhost:2000/connect/authorize? 
client_id=client 
&client_secret=secret 
&grant_type=authorization_code 
&username=admin 
&password=admin 
&response_type=id_token+token 
&scope=openid+profile+offline_access 

クライアント:

new Client 
{ 
    ClientId = "client", 
    ClientSecrets = { new Secret("secret".Sha256())},     
    AllowedGrantTypes = new List<string> { "authorization_code" }, 
    AccessTokenType = AccessTokenType.Jwt, 
    AllowedScopes = { StandardScopes.OpenId.Name, "api1" } 
} 

ユーザー:

new InMemoryUser 
    { 
    Subject = "1", 
    Username = "admin", 
    Password = "admin" 
    } 

私の質問は、access_tokenはとid_token取得するためにエンドポイントを認可呼び出す方法、ありますか?私の「クライアント」と「ユーザー」の設定で何が問題になっていますか?

+1

ロギングを有効にしましたか?それは多くの構成上の問題を発見するのに役立ちます。 –

答えて

1

つのアイデア:

  1. HTTP 405エラーは、Webブラウザのsame origin policyに起因することができます。あなたのクライアントは、ブラウザベースのクライアントではなく機密クライアントのように見えます。これは、誤ってWebブラウザから要求を出さない限り、同じ発信元ポリシーが適用されないことを意味します。

  2. 許可されていないHTTP動詞を使用すると、HTTP 405エラーが発生することもあります。たとえば、URLにGETのみが許可されている場合はPOSTを使用します。 GETリクエストをしていることを100%確認してください。

1

いくつかの問題があります。複数のフローを混在させています。

1)承認エンドポイント(トークンエンドポイントではない)からid_tokenを戻したい場合は、ハイブリッドフローを使用する必要があります。認証コードフローではありません。 hereを参照してください。したがって、それに応じて応答タイプを変更する必要があります。クライアントがSPAの場合は、暗黙のフローを使用して、承認エンドポイントからid_tokenaccess_tokenを取得できますが、認証コードフローは取得できません。

2)client_secretは、認証エンドポイントのパラメータではありません。どちらもgrant_typeです。有効なパラメータについては、hereを参照してください。

3)いかなる場合でも、ユーザー名とパスワードをAuthorizeエンドポイントに送信しないでください。リソース所有者のフローを使用している場合は、それらをトークンエンドポイントに送信しますが、決して承認しないでください。有効なパラメータの説明を参照して、上記のリンクを参照してください。

ですから、ハイブリッド流れに切り替えると、このようにコードを変更することができます。

http://localhost:2000/connect/authorize? 
client_id=client 
&redirect_uri=<add redirect uri> 
&response_type=code+id_token+token 
&scope=openid+profile+api1 
&state=... 

この呼び出しからの応答がid_tokenaccess_tokenが含まれます。

new Client 
{ 
    ClientId = "client", 
    ClientName = "Your Client", 
    AllowedGrantTypes = GrantTypes.Hybrid, 

    ClientSecrets = 
    { 
     new Secret("secret".Sha256()) 
    }, 

     RedirectUris   = { "<add redirect uri>" }, 
     PostLogoutRedirectUris = { "<add post logout redirect uri>" }, 

    AllowedScopes = 
    { 
     IdentityServerConstants.StandardScopes.OpenId, 
     IdentityServerConstants.StandardScopes.Profile, 
     "api1" 
    } 
}; 
+0

https:// stackoverflow。com/questions/47979716/how-to-call-authorize-endpoint-without-login-prompt-in-gluu - このオプションはどれですか? –

関連する問題