1

将代码更新到新范围时遇到问题。目前我使用userinfo.profile并且一切正常。

根据Google+ OAuth 2.0 范围,新plus.me范围允许应用程序知道用户是谁,并plus.login提供额外的访问权限(年龄、语言、圈子等)。

如果我替换userinfo.profileplus.me- 一切正常:方法WebServerClient.RequestUserAuthorization授权用户并ProcessUserAuthorization给我一个令牌。

但是,如果我plus.login改为询问范围 - Google 会在我的回调和下一次调用WebServerClient.ProcessUserAuthorization失败时添加额外的查询参数,因为实现使用当前 rul 来生成新redirect_url的、条带化“已知”参数并留下“新未知”Google 参数。他redirect_url在 Google Api Console 中注册时不匹配,并且 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

Call for token (for plus.mescope) 将成功:

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_url参数:

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 规范说在授权响应中需要这些参数codestate并说要注意添加其他参数。但它也说

客户端必须忽略无法识别的响应参数

这是否意味着这是 DNOA 问题而不是 Google 问题?

可能是 DNOA 必须将可为空的 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
4

0 回答 0