请求OpenID时,id_令牌的Base64/Json编码声明部分中来自Google Oauth服务器的损坏响应

请求OpenID时,id_令牌的Base64/Json编码声明部分中来自Google Oauth服务器的损坏响应,oauth,google-api,openid,Oauth,Google Api,Openid,当使用Oauth作为我的网站的登录机制时,如何处理这种损坏的响应?我正在实现Oauth登录,它将替换我以前使用的OpenID登录 我将用户重定向到https://accounts.google.com/o/oauth2/auth请求他们的许可。我正在使用范围电子邮件配置文件openid和的openid.realmhttp://subdomain.mysite.example.com 用户接受权限并返回code参数 我将此代码参数提交到https://accounts.google.com/o/o

当使用Oauth作为我的网站的登录机制时,如何处理这种损坏的响应?我正在实现Oauth登录,它将替换我以前使用的OpenID登录

  • 我将用户重定向到
    https://accounts.google.com/o/oauth2/auth
    请求他们的许可。我正在使用范围
    电子邮件配置文件openid
    的openid.realmhttp://subdomain.mysite.example.com
  • 用户接受权限并返回
    code
    参数
  • 我将此代码参数提交到
    https://accounts.google.com/o/oauth2/token
    以及我的应用程序凭据
  • Google发回一个JSON repsonse,其中包括一个
    access\u令牌
    和一个
    id\u令牌
  • 我必须解析
    id\u令牌
    ,以确定用户的身份。令牌是三个由句点(
    )分隔的base64编码部分。我把它按时段分开,看中间那个有我要找的“索赔”信息的。其他部分是我忽略的加密签名,因为我通过HTTPS直接与Google通信
  • 当我解码声明时,它应该是一个JSON对象,但有时它会损坏。当它损坏时,损坏总是围绕着打开的id部分
  • 以下是
    访问\u令牌的示例(此处的数据用于我自己的帐户):

    下面是摘录的中间“索赔”部分:

    Base64解码为损坏的JSON对象。以下是损坏部分的一个片段:

    "openid_id":"https://www.google.com/accounts/o8/idYPR]Ø]Û
    
    我最初认为这是一个字符编码问题。我在将base64解码为字符串时使用UTF-8。我尝试过使用其他编码,但所有编码都已损坏。我认为这与字符编码无关,因为URL中发生的损坏应该都是ASCII

    这个错误似乎只发生在某些帐户上,但当它发生时,它会持续发生在该帐户上。即使完全退出谷歌也不能解决这个问题

    我第一次看到这个问题是在中删除了我的测试应用程序,并使用新凭据创建了一个新应用程序。我的谷歌账户在旧应用程序上没有问题,但在新应用程序下有问题


    是我做错了什么,还是谷歌有bug?

    您可能没有正确解码令牌

    我转到并粘贴了您提供的令牌:

    eyJhbGciOiJSUzI1NiIsImtpZCI6IjM1MzExZDJiMWI2OTQ0NTVkYmY2ZmE4YTUyYTNmNzZkYTUwMDUwM2IifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTAwNDkwNzU0NjA0MjY0MTgxNzg0IiwiYXpwIjoiMTAwMzUzNDIwNDkwOC1nM3Z1bDAzb2phbGRkZjN0NmxlMjdvMG9xZWhzazNmNy5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImVtYWlsIjoic3Rvc3Rlcm1AZ21haWwuY29tIiwiYXRfaGFzaCI6Im1kalkxdTlEQ2VXcEVwWC15N0h3enciLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXVkIjoiMTAwMzUzNDIwNDkwOC1nM3Z1bDAzb2phbGRkZjN0NmxlMjdvMG9xZWhzazNmNy5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsIm9wZW5pZF9pZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvbzgvaWQ_aWQ9QUl0T2F3bDR4NlZXVE1fbHVWSGhwb1VqTlE1VE56c3BzcjFqTF8wIiwiaWF0IjoxNDA1NDI2MDQ0LCJleHAiOjE0MDU0Mjk5NDR9.UWEZZOhJfg5CGEHd9FNnYg__tiAysmMABk_Q0wSGaq6jbXPwe91J4JXwSgpwVBa09St7zjLRL-ajswMe-qooBe_ItzaEhXPgfc6pKWBSIWeqaj-PM2lyXECWQTAwxsm8xtBXCtjJUfyyjp3ciA95g7Rz9JHPTGDJRMywkFhb-fc
    
    已解码为:

    标题:

    { "alg": "RS256", "kid": "35311d2b1b694455dbf6fa8a52a3f76da500503b" }
    
    索赔:

    {
      "exp": 1405429944,
      "sub": "100490754604264181784",
      "iss": "accounts.google.com",
      "email_verified": true,
      "at_hash": "mdjY1u9DCeWpEpX-y7Hwzw",
      "openid_id": "https:\/\/www.google.com\/accounts\/o8\/id?id=AItOawl4x6VWTM_luVHhpoUjNQ5TNzspsr1jL_0",
      "azp": "1003534204908-g3vul03ojalddf3t6le27o0oqehsk3f7.apps.googleusercontent.com",
      "iat": 1405426044,
      "email": "REMOVED_TO_AVOID_SPAM",
      "aud": "1003534204908-g3vul03ojalddf3t6le27o0oqehsk3f7.apps.googleusercontent.com"
    }
    
    因此,您的OpenID看起来是
    https://www.google.com/accounts/o8/id?id=AItOawl4x6VWTM_luVHhpoUjNQ5TNzspsr1jL_0“

    如果使用Java,则可以使用Apache commons Base64类获得相同的结果:

    String str = "eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTAwNDkwNzU0NjA0MjY0MTgxNzg0IiwiYXpwIjoiMTAwMzUzNDIwNDkwOC1nM3Z1bDAzb2phbGRkZjN0NmxlMjdvMG9xZWhzazNmNy5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImVtYWlsIjoic3Rvc3Rlcm1AZ21haWwuY29tIiwiYXRfaGFzaCI6Im1kalkxdTlEQ2VXcEVwWC15N0h3enciLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXVkIjoiMTAwMzUzNDIwNDkwOC1nM3Z1bDAzb2phbGRkZjN0NmxlMjdvMG9xZWhzazNmNy5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsIm9wZW5pZF9pZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvbzgvaWQ_aWQ9QUl0T2F3bDR4NlZXVE1fbHVWSGhwb1VqTlE1VE56c3BzcjFqTF8wIiwiaWF0IjoxNDA1NDI2MDQ0LCJleHAiOjE0MDU0Mjk5NDR9";
    System.out.println(new String(org.apache.commons.codec.binary.Base64.decodeBase64(str.getBytes())));
    

    为了解决这个问题,我不得不从com.google.appengine.repackaged.com.google.common.util.Base64切换到org.apache.commons.codec.binary.Base64;

    Java 6/7新类javax.xml.bind.DatatypeConverter将无法使用这些google Base64字符串。出于某种原因,我必须坚持使用commons编解码器。
    {
      "exp": 1405429944,
      "sub": "100490754604264181784",
      "iss": "accounts.google.com",
      "email_verified": true,
      "at_hash": "mdjY1u9DCeWpEpX-y7Hwzw",
      "openid_id": "https:\/\/www.google.com\/accounts\/o8\/id?id=AItOawl4x6VWTM_luVHhpoUjNQ5TNzspsr1jL_0",
      "azp": "1003534204908-g3vul03ojalddf3t6le27o0oqehsk3f7.apps.googleusercontent.com",
      "iat": 1405426044,
      "email": "REMOVED_TO_AVOID_SPAM",
      "aud": "1003534204908-g3vul03ojalddf3t6le27o0oqehsk3f7.apps.googleusercontent.com"
    }
    
    String str = "eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTAwNDkwNzU0NjA0MjY0MTgxNzg0IiwiYXpwIjoiMTAwMzUzNDIwNDkwOC1nM3Z1bDAzb2phbGRkZjN0NmxlMjdvMG9xZWhzazNmNy5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImVtYWlsIjoic3Rvc3Rlcm1AZ21haWwuY29tIiwiYXRfaGFzaCI6Im1kalkxdTlEQ2VXcEVwWC15N0h3enciLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXVkIjoiMTAwMzUzNDIwNDkwOC1nM3Z1bDAzb2phbGRkZjN0NmxlMjdvMG9xZWhzazNmNy5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsIm9wZW5pZF9pZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvbzgvaWQ_aWQ9QUl0T2F3bDR4NlZXVE1fbHVWSGhwb1VqTlE1VE56c3BzcjFqTF8wIiwiaWF0IjoxNDA1NDI2MDQ0LCJleHAiOjE0MDU0Mjk5NDR9";
    System.out.println(new String(org.apache.commons.codec.binary.Base64.decodeBase64(str.getBytes())));