コードを新しいスコープに更新する際に問題が発生しました。現在私は使用userinfo.profileしており、すべて正常に動作します。
Google+ OAuth 2.0 スコープによると、新しいplus.meスコープにより、アプリケーションはユーザーが誰であるかを知ることができ、plus.login追加のアクセス (年齢、言語、サークルなど) も付与されます。
-に置き換えるuserinfo.profileと、plus.meすべて正常に機能します。メソッドWebServerClient.RequestUserAuthorizationはユーザーを承認ProcessUserAuthorizationし、トークンを提供します。
しかし、代わりにスコープを尋ねると、plus.loginGoogle は追加のクエリ パラメータをコールバックに追加し、次の呼び出しはWebServerClient.ProcessUserAuthorization失敗します。これは、実装が現在の rul を使用して新しい を作成しredirect_url、「既知の」パラメータをストライピングし、「新しい未知の」Google パラメータを残すためです。これは、Google Api コンソールに登録されているものと一致せredirect_urlず、Google サーバーは 400 応答を返します。
これは、スコープ付きの承認からの成功応答ですplus.me(NetOpenAuth.Messaging.Channel ログから):
Incoming HTTP request: GET http://localhost:40004/Me/LoginComplete?from=Google&state=TWXf6Zq3XYSlwyfCDt3GiQ&code=4/qC_KeuiykcVm1sayIyEdnBjiklxz.AoMfk5TqaXQcsNf4jSVKMpY-GxwThAI
After binding element processing, the received EndUserAuthorizationSuccessAuthCodeResponse (2.0) message is:
code: 4/qC_KeuiykcVm1sayIyEdnBjiklxz.AoMfk5TqaXQcsNf4jSVKMpY-GxwThAI
state: TWXf6Zq3XYSlwyfCDt3GiQ
from: Google
plus.loginそして、ここに(成功した)スコープ付きの承認応答があります:
Incoming HTTP request: GET http://localhost:40004/Me/LoginComplete?from=Google&state=26R-O3YN6u3-5EKIlJzFFw&code=4/zOoeVq8vec068x2-CyPq4PjPNtRT.osemzp8Zl7sQsNf4jSVKMpbcmWQThAI&authuser=0&prompt=consent&session_state=27ca4bd2e70d0721bc1fa781b900a558e59fe4c7..d409
After binding element processing, the received EndUserAuthorizationSuccessAuthCodeResponse (2.0) message is:
code: 4/zOoeVq8vec068x2-CyPq4PjPNtRT.osemzp8Zl7sQsNf4jSVKMpbcmWQThAI
state: 26R-O3YN6u3-5EKIlJzFFw
from: Google
authuser: 0
prompt: consent
session_state: 27ca4bd2e70d0721bc1fa781b900a558e59fe4c7..d409
トークンの呼び出し (plus.meスコープ用) は成功します。
Prepared outgoing AccessTokenAuthorizationCodeRequestC (2.0) message for https://accounts.google.com/o/oauth2/token:
code: 4/qC_KeuiykcVm1sayIyEdnBjiklxz.AoMfk5TqaXQcsNf4jSVKMpY-GxwThAI
redirect_uri: http://localhost:40004/Me/LoginComplete?from=Google
grant_type: authorization_code
client_id: 175802076419.apps.googleusercontent.com
client_secret: ********
ただし、plus.loginスコープ 3 の新しいパラメーター (authuser、prompt、session_state) はredirect_urlparamに転送されます。
Prepared outgoing AccessTokenAuthorizationCodeRequestC (2.0) message for https://accounts.google.com/o/oauth2/token:
code: 4/zOoeVq8vec068x2-CyPq4PjPNtRT.osemzp8Zl7sQsNf4jSVKMpbcmWQThAI
redirect_uri: http://localhost:40004/Me/LoginComplete?from=Google&authuser=0&prompt=consent&session_state=27ca4bd2e70d0721bc1fa781b900a558e59fe4c7..d409
grant_type: authorization_code
client_id: 175802076419.apps.googleusercontent.com
client_secret: ********
そして、この redirect_url が登録済みと一致しないとすぐに、エラーが発生します。
https://accounts.google.com/o/oauth2/token returned 400 BadRequest: Bad Request
OAuth2 仕様では、承認応答には paramscodeとstateが必要であり、他のパラメーターの追加について注意が必要であると述べています。しかし、それはまた言います
クライアントは、認識されていない応答パラメーターを無視する必要があります
これは DNOA の問題であり、Google の問題ではないということですか?
DNOA は null 許容の responseUri パラメータを ProcessUserAuthorization に追加し、現在の URL から推測する代わりにそれを使用する必要があるかもしれません...
最も簡単な回避策は何ですか (Google ライブラリの使用を除く)?
アップデート:
/oauth の元の要求は次のとおりです。
Prepared outgoing EndUserAuthorizationRequestC (2.0) message for https://accounts.google.com/o/oauth2/auth:
client_id: 175802076419.apps.googleusercontent.com
redirect_uri: http://localhost:40004/Me/LoginComplete?from=Google
state: TWXf6Zq3XYSlwyfCDt3GiQ
scope: https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/plus.me
response_type: code