我目前正在多个地方使用应用程序调用gapi.signIn
方法。
- 当用户登录时
- 当用户注册时
- 当用户想要将其应用帐户关联到其 Google 帐户时
中,每个实例都使用不同的回调参数调用gapi.signIn()
。
由于这是一个单页应用,一旦执行了所有操作而无需重新加载页面,并且稍后对上述任何方法的调用都会导致触发每个回调。
前任。如果用户登录,则注销并尝试创建一个新帐户,系统会告知他们的Google帐户已绑定到帐户(这是预期行为)。 但是,如果他们尝试再次登录,则尝试创建用户时调用的上一个回调将再次触发,并且他们将再次被发送到解释Google帐户与应用帐户绑定的页面。
用一个简单的代码示例来解释事情:
var ENV = {...};
function handleClickOfButton_1() {
window.authCallback_1 = function() {
console.log('callback 1');
};
// attach callback one
gapi.auth.signIn({
clientid: ENV.APP.GOOGLE_AUTH.clientid,
scope: ENV.APP.GOOGLE_AUTH.scope,
cookiepolicy: 'single_host_origin',
callback: 'authCallback_1',
});
}
function handleClickOfButton_2() {
window.authCallback_2 = function() {
console.log('callback 2');
};
// attach callback one
gapi.auth.signIn({
clientid: ENV.APP.GOOGLE_AUTH.clientid,
scope: ENV.APP.GOOGLE_AUTH.scope,
cookiepolicy: 'single_host_origin',
callback: 'authCallback_2',
});
}
如果我单击第一个按钮(触发第一个处理程序),则 signIn 方法将被调用一次,如果我单击第二个按钮,则将调用两个回调方法。
输出:
// click button 1
> callback 1
// click button 2
> callback 1
> callback 2
我该如何防止这种情况?我无法找到重置方法。 使用相同的回调方法名称无济于事。 覆盖窗口。[method_name] 也不起作用。
我所做的 - 添加一个var counter = 0
,在回调函数的末尾递增。如果counter > 0
则回调将为空。这样它只添加一次回调函数(无论如何这是预期的行为,而且首先需要这个黑客真是令人讨厌,谢谢谷歌提供这样一个有缺陷的 API :/)。
var counter = 0;
gapi.auth.signIn({
clientid: '1234567890',
cookiepolicy: 'single_host_origin',
scope: 'profile email',
callback: counter > 0 ? null : function signInCallback(authResult) {
if (authResult['status']['signed_in'] && authResult['status']['method'] == 'PROMPT') {
var token = authResult.access_token;
// Update the app to reflect a signed in user
// Hide the sign-in button now that the user is authorized, for example:
gapi.client.load('plus', 'v1', function() {
gapi.client.plus.people.get({
userId: 'me'
}).execute(function(response) {
console.log('Do my thing here...');
});
});
} else {
// Update the app to reflect a signed out user
// Possible error values:
// "user_signed_out" - User is signed-out
// "access_denied" - User denied access to your app
// "immediate_failed" - Could not automatically log in the user
console.log('Sign-in state: ' + authResult['error']);
}
counter = 1;
}
});