请求OpenID时,id_令牌的Base64/Json编码声明部分中来自Google Oauth服务器的损坏响应
当使用Oauth作为我的网站的登录机制时,如何处理这种损坏的响应?我正在实现Oauth登录,它将替换我以前使用的OpenID登录请求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
https://accounts.google.com/o/oauth2/auth
请求他们的许可。我正在使用范围电子邮件配置文件openid
和的openid.realmhttp://subdomain.mysite.example.com
code
参数https://accounts.google.com/o/oauth2/token
以及我的应用程序凭据access\u令牌
和一个id\u令牌
id\u令牌
,以确定用户的身份。令牌是三个由句点(
)分隔的base64编码部分。我把它按时段分开,看中间那个有我要找的“索赔”信息的。其他部分是我忽略的加密签名,因为我通过HTTPS直接与Google通信访问\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())));