我正在尝试在我们的网站上实现谷歌登录。我已阅读文档并在 apis 控制台上设置了一个应用程序。
我更喜欢注册对话框显示在弹出窗口中,并且在用户登录并接受我将获得 javascript 回调的权限后。根据文档,这个 api 也支持。所以我在文档的帮助下构建了以下内容;-)
第一部分是异步加载 google 客户端脚本,并使用正确的 clientid 和 apikey 初始化脚本。
$gp = new googlePlus('@Trustpilot.Web.Social.Google.ClientID', '@Trustpilot.Web.Social.Google.ApiKey');
(function () {
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/client.js?onload=googlePlusClientLoad';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();
下一部分是使用 google 客户端 api 的部分。加载 client.js 时调用 handleClientLoad()。该方法检查使用是否经过身份验证。如果用户是,我的想法是我想登录用户。如果用户尚未通过身份验证,则会有一个按钮,并且当单击 handleAuthClick() 时,它的基本功能与 handleClientLoad() 相同,但会出现一个弹出窗口,用户最常登录(使用谷歌帐户)并接受权限。登录后调用 handleAuthResult() 登录用户。
function googlePlus(clientId, apiKey) {
this.clientId = clientId;
this.apiKey = apiKey;
this.scopes = 'https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.email';
/// This method is called when the javascript is loaded async
this.handleClientLoad = function() {
gapi.client.setApiKey(this.apiKey);
window.setTimeout(this.authorize(true), 1);
};
this.handleAuthResult = function (authResult) {
console.log(authResult);
if (authResult && !authResult.error) {
var token = gapi.auth.getToken();
console.log(token);
}
else if (authResult && authResult.error) {
alert(authResult.error);
}
};
this.handleAuthClick = function(event) {
this.authorize(false);
return false;
};
this.makeApiCall = function() {
gapi.client.load('plus', 'v1', function () {
var request = gapi.client.plus.people.get({
'userId': 'me'
});
request.execute(function (resp) {
console.log(resp);
});
});
};
this.authorize = function (immediate) {
gapi.auth.authorize({ client_id: this.clientId, scope: this.scopes, immediate: immediate }, this.handleAuthResult());
//gapi.auth.authorize({ client_id: this.clientId, scope: this.scopes, immediate: immediate }, this.handleAuthResult());
};
}
var googlePlusClientLoad = function() {
$gp.handleClientLoad();
};
所以现在解决问题:
- 当调用 handleClientLoad 时,即使用户已经通过身份验证,用户也永远不会被验证。
- 如果用户使用 handleAuthClick() 弹出窗口显示和登录,handleAuthResult() 的权限和回调工作。但是参数 authResult 总是什么都没有(应该是文档中的内容)。
- 如果我多次尝试而不重新加载页面,我有时可以让 makeApiCall() 和 gapi.auth.getToken() 工作并获得我需要的信息。