Google登录验证Google ID

时间:2015-10-05 04:08:59

标签: php google-oauth2

我正在尝试将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和服务器端身份验证方面几乎没有经验,并且真的不知道欺骗像这样的系统是多么容易。我想它看起来很安全,但是对于那些想偷偷溜进去的人来说是敞开的大门。感谢任何建议。

1 个答案:

答案 0 :(得分:1)

所以,如果有人在以后找到这个,这就是我最终做的事情(警告:我不知道这是否是最安全的方式,但对我来说似乎没问题)......

  1. 将id_token发布到我的php页面
  2. 将id令牌发布到 https://www.googleapis.com/oauth2/v3/tokeninfo via curl
  3. 将响应对象从curl中取回,并将其与aud进行核对 和高清     简单的===比较
  4. 如果他们退房,请执行API事项
  5. 我希望能帮助别人。如果这种方法存在一些灾难性的错误,请告诉我!