【问题标题】:Cloud endpoints oauth2 error云端点 oauth2 错误
【发布时间】:2013-03-02 20:17:54
【问题描述】:

在 YouTube 上观看了 IMO 有用的 GDL 剧集后,我最近能够重构我的应用引擎应用程序以支持 Cloud Endpoints。

我正在测试我的网站,使用 javascript 客户端来处理授权,然后返回最有效的项目列表。但是,当我调用端点返回项目列表时,我的 App Engine 日志中出现了这组错误:

I 2013-03-14 08:52:14.748 Checking for id_token.
W 2013-03-14 08:52:14.748 id_token verification failed: Wrong number of segments in token: ya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE
I 2013-03-14 08:52:14.748 Checking for oauth token.
W 2013-03-14 08:52:14.885 Found 1 RPC request(s) without matching response (presumably due to timeouts or other errors)

据我所知,谷歌返回的所有身份验证令牌中只有 2 个“段”而不是 3 个,所以我不清楚这意味着什么。

这是来自我的浏览器控制台的授权请求标头: 授权承载 ya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE

任何帮助将不胜感激。

【问题讨论】:

    标签: google-app-engine google-cloud-endpoints


    【解决方案1】:

    有两种类型的令牌:ID 令牌和标准 Bearer 令牌。

    不记名令牌:

    这是通过 OAuth 舞蹈检索到的标准令牌。

    ID 令牌:

    典型的 ID 令牌看起来像 eyJhbGciOiJSUzI1NiIsImtpZCI6IjIxZWFlMTVkODE.eyJpc3MiOiJhY2NvdW50cy5n.oXLawgz_ed (除了更长的段)并且是签名的 JWT。

    可以在 JavaScript 中通过在响应类型中添加 'id_token' 来获取 ID 令牌,就像我们在井字游戏中所做的那样 sample

    这样,OAuth 请求的令牌returned from 也会有一个 ID 令牌:

    var token = gapi.auth.getToken();
    // Use id_token instead of bearer token
    token.access_token = token.id_token;    
    

    您在日志中看到的内容:

    线

    W 2013-03-14 08:52:14.748 id_token verification failed: Wrong number of segments in token: ya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE
    

    只是一个警告,意味着观察到的令牌ya29.AHE...不是一个ID令牌和日志中的下一行

    I 2013-03-14 08:52:14.748 Checking for oauth token.
    

    表示它正在继续检查令牌是否为不记名令牌。

    意味着您的令牌无效,只是它正在检查承载令牌。

    线

    W 2013-03-14 08:52:14.885 Found 1 RPC request(s) without matching response (presumably due to timeouts or other errors)
    

    可能意味着有一个 RPC 来验证失败的令牌。验证承载令牌的主要部分是调用

    oauth.get_current_user(EMAIL_SCOPE)
    

    和一个请求

    https://www.googleapis.com/oauth2/v2/tokeninfo?access_token=ya29.AHE...
    

    验证令牌上的客户端 ID 和受众。

    ID 令牌深度:

    第一段是使用的加密的 base64url 编码描述。例如。

    >>> import base64, json
    >>> segments = id_token.split('.')
    >>> first_segment = segments[0] + '=' * ((4 - len(segments[0])) % 4)
    >>> json.loads(base64.urlsafe_b64decode(first_segment))
    {u'alg': u'RS256', u'kid': u'21eae15d817c1b4a8f6ff4501930512d07cbe684'}
    

    第二段是对令牌内容的 base64url 编码描述:

    >>> second_segment = segments[1] + '=' * ((4 - len(segments[0])) % 4)
    >>> base64.urlsafe_b64decode(second_segment)
    {u'at_hash': u'xxxyyyzzz',  # Fake Data
     u'aud': u'someclient_id.apps.googleusercontent.com',
     u'azp': u'someclient_id.apps.googleusercontent.com',
     u'cid': u'someclient_id.apps.googleusercontent.com',
     u'email': u'joe@mail.com',
     u'email_verified': u'true',
     u'exp': 1363289943,
     u'hd': u'google.com',
     u'iat': 1363286043,
     u'id': u'123456789',  # Fake Data
     u'iss': u'accounts.google.com',
     u'sub': u'123456789',  # Fake Data
     u'token_hash': u'xxxyyyzzz',  # Fake Data
     u'verified_email': u'true'}
    

    第三部分是前两部分的组合,使用 Google 的私钥签名。

    【讨论】:

    • 谢谢bossylobster!再次感谢您将 GDL 放到 youtube 上 - 这是让这些东西正常工作的一个很好的快速入门。
    • @bossylobster 是否可以在服务器中获取访问代码,以便我可以在服务器中使用它进行调用?我的意思是,在使用 javascript api 对用户进行身份验证后,我想代表服务器中的用户调用 google plus api。
    • 是的,但您需要使用典型的服务器端 OAuth 2.0
    • 但是如果我使用 javascript oauth 库对用户进行身份验证,我可以将令牌发送到服务器并在那里使用它进行调用吗?
    • 没有。令牌将被铸造用于浏览器流程,而不是服务器端流程。
    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2015-05-10
    • 2020-08-17
    相关资源
    最近更新 更多