我正在尝试将Google登录纳入网页。我已按照文档操作并使用此脚本:
function onSignIn(googleUser) {
var id_token = googleUser.getAuthResponse().id_token;
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://www.googleapis.com/oauth2/v3/tokeninfo?id_token='+id_token);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
console.log('Signed in as: ' + xhr.responseText);
};
xhr.send('idtoken=' + id_token);
}
但是,我并不是真的理解下一点 - 我可以看到responseText对象,但是我该怎么做呢?我只想验证用户是否来自我们的工作,即拥有来自我们域的电子邮件地址(它是用于工作gmail的Google应用)。一旦它被验证我想发布一个不同的API的PHP帖子,但我可以想到在后端制作的任何种类的检查似乎很容易欺骗我。我看到有用于验证令牌的{php}库here,但我也不知道我应该怎么做。任何人都可以给我指针吗?
[编辑:以下信息添加]
因此,我得到的响应是这样的JSON对象(有意义的值替换为随机字符串):
{
"iss": "accounts.google.com",
"at_hash": "e2CYheQnJjpBfyS2StkM9D",
"aud": "168479532489-Y23kc3sHhn9frJ65Bwtx8Ff4Xdq5RqSH.apps.googleusercontent.com",
"sub": "56798241598765321849762",
"email_verified": "true",
"azp": "168479532489-Y23kc3sHhn9frJ65Bwtx8Ff4Xdq5RqSH.apps.googleusercontent.com",
"hd": "example.com",
"email": "lucas@example.com",
"iat": "1444085795",
"exp": "1444089395",
"name": "Lucas Smith",
"given_name": "Lucas",
"family_name": "Smith",
"locale": "en",
"alg": "GU788",
"kid": "jyaKrpekvYhcRx6KpYSbKhAdYYScLNbEqxqMfCY7"
}
现在,根据this,我仍然需要检查aud声明是否包含我的应用程序的客户端ID,我还可以检查托管域(此处的高清密钥)是否与我们的域匹配。
所以,问题变成了:如果我通过ajax将该JSON对象发送到php页面,那么将对象中的字符串与我从开发者控制台获得的字符串进行比较 - 我猜测使用{{1我只需要做什么?如果它们匹配,做我想做的事情(调用其他API等)?
对于过分谨慎感到抱歉。我在php和服务器端身份验证方面几乎没有经验,并且真的不知道欺骗像这样的系统是多么容易。我想它看起来很安全,但是对于那些想偷偷溜进去的人来说是敞开的大门。感谢任何建议。
答案 0 :(得分:1)
所以,如果有人在以后找到这个,这就是我最终做的事情(警告:我不知道这是否是最安全的方式,但对我来说似乎没问题)......
https://www.googleapis.com/oauth2/v3/tokeninfo
via curl ===
比较我希望能帮助别人。如果这种方法存在一些灾难性的错误,请告诉我!