WSO2 API マネージャー 1.10.0 を使用しています。WSO2 Identity Server 5.1.0 をキー マネージャーとして構成し、MySQL Community Server 5.6 をデータベースに使用しています。認証コード付与タイプで取得したトークン (refresh_token 付与タイプ) を更新しようとすると、400 Bad Request エラー (invalid_grant - Provided Authorization Grant is invalid) が発生し、新しいトークンを取得できません。次に、client_credentials と password 付与タイプを試してみましたが、それらの付与タイプについてはトークンを更新できました。
Identity Server のログを確認したところ、Identity Server が最新のトークンを取得しようとするとエラーが発生することがわかりました (以下のログ)。
TID: [-1234] [] [2016-12-15 12:40:00,470] DEBUG {org.wso2.carbon.identity.oauth2.OAuth2Service} - Access Token request received for Client ID OQU0_FyRQcdvTFbygziFw67ASHwa, User ID null, Scope : [openid, profile] and Grant Type : refresh_token
TID: [-1234] [] [2016-12-15 12:40:00,470] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.clientauth.AbstractClientAuthHandler} - Can authenticate with client ID and Secret. Client ID: OQU0_FyRQcdvTFbygziFw67ASHwa
TID: [-1234] [] [2016-12-15 12:40:00,470] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.clientauth.AbstractClientAuthHandler} - Grant type : refresh_token Strict client validation set to : null
TID: [-1234] [] [2016-12-15 12:40:00,470] DEBUG {org.wso2.carbon.identity.oauth2.util.OAuth2Util} - Client credentials were available in the cache for client id : OQU0_FyRQcdvTFbygziFw67ASHwa
TID: [-1234] [] [2016-12-15 12:40:00,470] DEBUG {org.wso2.carbon.identity.oauth2.util.OAuth2Util} - Successfully authenticated the client with client id : OQU0_FyRQcdvTFbygziFw67ASHwa
TID: [-1234] [] [2016-12-15 12:40:00,474] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.grant.RefreshGrantHandler} - Error while retrieving the latest refresh token
TID: [-1234] [] [2016-12-15 12:40:00,474] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} - Invalid Grant provided by the client Id: OQU0_FyRQcdvTFbygziFw67ASHwa
TID: [-1234] [] [2016-12-15 12:40:00,474] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} - OAuth-Error-Code=invalid_grant client-id=OQU0_FyRQcdvTFbygziFw67ASHwa grant-type=refresh_token scope=openid profile
TID: [-1234] [] [2016-12-15 12:40:06,492] DEBUG {org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask} - Running deployment synchronizer update... tenant : carbon.super
TID: [-1234] [] [2016-12-15 12:40:06,588] DEBUG {org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask} - Running deployment synchronizer commit... tenant : carbon.super
ソース コードをデバッグしましたが、この問題は次の SQL クエリ、特に USER_DOMAIN=null 句に関連していると思われます。
SELECT ACCESS_TOKEN, REFRESH_TOKEN, TIME_CREATED, REFRESH_TOKEN_TIME_CREATED, VALIDITY_PERIOD, REFRESH_TOKEN_VALIDITY_PERIOD, TOKEN_STATE, USER_TYPE, TOKEN_ID, SUBJECT_IDENTIFIER FROM IDN_OAUTH2_ACCESS_TOKEN WHERE CONSUMER_KEY_ID = (SELECT ID FROM IDN_OAUTH_CONSUMER_APPS WHERE CONSUMER_KEY = 'OQU0_FyRQcdvTFbygziFw67ASHwa') AND AUTHZ_USER='michael.pinheiro' AND TENANT_ID=-1234 AND USER_DOMAIN=null AND TOKEN_SCOPE_HASH='369db21a386ae433e65c0ff34d35708d' ORDER BY TIME_CREATED DESC LIMIT 1
また、認証コード付与タイプを使用すると、テーブル IDN_OAUTH2_ACCESS_TOKEN で作成されたアクセス トークンのユーザー ドメイン列が NULL に設定されますが、password または client_credentials 付与タイプを使用すると、値は「PRIMARY」になります。
それはバグでしょうか、それとも、新しいアクセス トークンを作成するときにユーザー ドメインを何らかの形で PRIMARY に設定するパラメーターが欠落しているのでしょうか?
問題を再現するために実行したすべての手順を書き留めます。
ステップ 1: https://identity-dev.domain.pt/oauth2/authorize?response_type=code&client_id=OQU0_FyRQcdvTFbygziFw67ASHwa&scope=openid profile&redirect_uri= http://localhost:8100 にリダイレクトして認証コードを取得しています
ステップ 2: 前のステップで受け取ったコードを使用して、次のコマンドを実行してアクセス トークン (およびリフレッシュ トークン) を取得します。
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=authorization_code&client_id=OQU0_FyRQcdvTFbygziFw67ASHwa&client_secret=3kC6Uf9f8Lr8HVl2n03dhQc57Jsa&scope=openid profile&code=fd2f827afefba0ab0b17f9d701ad1488&redirect_uri= http://localhost:8100 ' " https:// identity-dev.domain.pt/oauth2/token "
ステップ 3: 前のステップで受け取ったリフレッシュ トークンを使用して、次のリクエストを実行して新しいトークンを取得しますが、この投稿で説明されているように、400 の不正なリクエストを受け取りました。
curl -X POST -H "Authorization: Basic T1FVMF9GeVJRY2R2VEZieWd6aUZ3NjdBU0h3YToza0M2VWY5ZjhMcjhIVmwybjAzZGhRYzU3SnNh" -H "Content-Type: application/x-www-form-urlencoded" -H "Accept: application/json" -d 'grant_type=refresh_token&scope=openid profile&refresh_token=7a7da99d70d48e10ac82e3681c63b0a1' " https://identity-dev.domain.pt/oauth2/token "
どんな助けでも大歓迎です!