我正在研究一个项目,用户可以在该项目中使用他们的Google帐户登录。登录后,他们将转到另一个页面,用户可以在多个不同页面之间浏览,每个页面都有一个注销按钮。
我正在尝试实现该功能,以便如果用户单击注销并使用Google登录,它将从应用程序中注销其Google帐户,但我仍然遇到一些奇怪的错误。
每个页面的meta标签都包含我的客户ID,如下所示:
<meta name="google-signin-client_id" content="OMITTED-CLIENT-ID.apps.googleusercontent.com">
每个页面都包含platform.js,如下所示:
<script src="https://apis.google.com/js/platform.js" async defer></script>
单击注销后,我检查用户是否使用了Google Signin,如果是,则初始化auth2并尝试注销,如下所示:
if (getCookie("UsingGoogleSignIn") === "1")
{
gapi.load('auth2', function() {
gapi.auth2.init();
var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function(){
alert("Successfully Logged Out");
//window.location = "/logout.php/state=not_logged_in";
});
});
}
我回来的错误是
Uncaught Error: nb
at tE (cb=gapi.loaded_0:192)
at jF.<anonymous> (cb=gapi.loaded_0:237)
at new _.C (cb=gapi.loaded_0:111)
at jF.BT (cb=gapi.loaded_0:237)
at Ay.Qv.a.(anonymous function) [as signOut] (https://apis.google.com/_/scs/apps-static/_/js/k=oz.gapi.en_GB.GSouU9gH1pU.O/m=auth2/rt=j/sv=1/d=1/ed=1/am=QQ/rs=AGLTcCNXlVeYtOxUtk6wkVB3WmvUfICGTA/cb=gapi.loaded_0:218:203)
at HelperFunctions.js:195
at platform.js:18
at Oa (platform.js:10)
at b (platform.js:18)
at Array.E.(anonymous function) (https://apis.google.com/js/platform.js:18:292)
在堆栈中,HelperFunctions.js:195行是我的代码中的以下行:
auth2.signOut().then(function(){
更新
从某种意义上讲,我应该使用init函数中的promise来触发签出,从而找到了问题,所以我的代码现在如下所示:
gapi.load('auth2', function() {
gapi.auth2.init().then(function(){
var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function(){
window.location = "/logout.php/state=not_logged_in";
});
});
});
现在看来确实可以正常使用,它可以重定向到/logout.php,但Google似乎没有注销。完成logout.php后,它会重定向回login.php,然后使用Google帐户自动登录回我的Web应用程序。
作为参考,PHP logout.php包含以下内容:
session_start();
unset($_COOKIE["ClientID"]);
setcookie("ClientID", null, -1, '/');
unset($_SESSION["ClientID"]);
unset($_SESSION["AuthToken"]);
unset($_SESSION["UserID"]);
session_destroy();
header('Location: /login.php?state=not_logged_in');