在我的应用程序中,我使用jsapi实现了Google注销。
我使用网址https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxx连接到Google,然后使用https://www.googleapis.com/plus/v1/people/xxxxxx从Google个人资料中获取用户数据。
现在我需要在点击应用程序中的按钮时从Google注销用户。如何在JavaScript中实现此功能,或者至少每次用户登录时都必须询问Google登录页面。
我尝试了approval_prompt=force
,但似乎没有工作。
答案 0 :(得分:207)
我不确定您是否使用OAuth登录Stack Overflow,例如“使用Google登录”选项,但是当您使用此功能时,Stack Overflow只是询问Google是否知道您是谁:
“谷歌哟,这个Vinesh家伙声称vinesh.e@gmail.com是他,是真的吗?”
如果您已经登录,Google会说“是”。如果没有,Google会说:
“等一下Stack Overflow,我会对这个家伙进行身份验证,如果他能为他的Google帐户输入正确的密码,那就是他了。”
当您输入Google密码时,Google会告诉Stack Overflow您说的是谁,Stack Overflow会让您登录。</ p>
这里的开发人员有时会对OAuth感到有些困惑......谷歌和Stack Overflow,Assembla,Vinesh的非常酷的网络应用程序都是不同的实体,Google对Vinesh酷炫的webapp上的帐户一无所知反之亦然,除了通过API公开的内容,您还可以使用它来访问个人资料信息。
当您的用户退出时,他/她没有退出Google,他/她正在退出您的应用,Stack Overflow,或Assembla,或使用Google OAuth进行身份验证的任何网络应用用户。
事实上,我可以退出所有Google帐户,但仍然会登录Stack Overflow。一旦您的应用知道该用户是谁,该人就可以退出Google。不再需要Google。
话虽如此,您要做的是将用户从真正不属于您的服务中注销。想想这样:作为一个用户,如果我使用我的Google帐户登录5种不同的服务,您认为我会是多么恼火,那么当我第一次退出其中一项服务时,我必须登录我的Gmail帐户再次,因为该应用程序开发人员决定,当我退出他的应用程序时,我也应该退出Google?那会很快变老。简而言之,你真的不想这样做 ......
话虽如此,如果您仍然想要将用户从Google注销,并意识到您可能正在破坏他们的工作流程,您可以动态地从其中一个用户构建注销网址Google服务注销按钮,然后使用img元素或脚本标记调用它:
<script type="text/javascript"
src="https://mail.google.com/mail/u/0/?logout&hl=en" />
OR
<img src="https://mail.google.com/mail/u/0/?logout&hl=en" />
OR
window.location = "https://mail.google.com/mail/u/0/?logout&hl=en";
如果您将用户重定向到退出页面,或者从非跨域限制的元素调用该用户,则该用户将退出Google。
请注意,这并不一定意味着用户将从您的应用程序注销,只有Google注销。 :)
重要的是要记住,当您注销应用时,您无需让用户重新输入密码。这就是重点!它对Google进行身份验证,因此用户无需在他或她使用的每个Web应用程序中反复输入密码。需要一些时间来习惯,但要知道,只要用户登录Google,您的应用就不必担心用户是否是他/她所说的人。
我在项目中使用与OAuth一样的Google个人资料信息。我尝试了同样的尝试,当他们不得不一次又一次地登录谷歌时,它真的开始让人生气,所以我们停止将它们从谷歌中删除。 :)
答案 1 :(得分:20)
您可以退出并重定向到您的网站:
var logout = function() {
document.location.href = "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://www.example.com";
}
答案 2 :(得分:4)
对我来说,它有效(java - android)
void RevokeAcess()
{
try{
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/revoke?token="+ACCESS_TOKEN);
org.apache.http.HttpResponse response = client.execute(post);
}
catch(IOException e)
{
}
CookieManager.getInstance().removeAllCookie(); // this is clear the cookies which tends to same user in android web view
}
你必须在android
中的AsyncTask中调用此函数答案 3 :(得分:1)
这可以让用户退出应用程序,但不会签署Google。
var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function () {
console.log('User signed out.');
});
来源:https://developers.google.com/identity/sign-in/web/sign-in
答案 4 :(得分:1)
您只需创建一个退出按钮并将此链接添加到该按钮,它就会将您从应用程序中注销,然后重定向到您想要的网站:
https://appengine.google.com/_ah/logout?continue=http://www.YOURSITE.com
只需在您的网站上切换YOURSITE
答案 5 :(得分:1)
誓言只会使Google实例为空,因此您就离开了Google。现在就是架构的制作方式。从Google注销,如果您注销应用程序是一项肮脏的工作,但如果要求中有同样规定,则无济于事。因此,将以下内容添加到您的signOut()函数中。我的项目是Angular 6应用:
document.location.href =“ https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://localhost:4200”;
这里localhost:4200是我的应用程序的URL。如果您的登录页面是xyz.com,请输入。
答案 6 :(得分:1)
此代码可以退出
<script>
function signOut()
{
var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function () {
console.log('User signed out.');
auth2.disconnect();
});
auth2.disconnect();
}
</script>
答案 7 :(得分:0)
我希望我们可以通过在登录时将令牌存储在会话中并在点击注销时访问令牌来实现此目的。
String _accessToken=(String)session.getAttribute("ACCESS_TOKEN");
if(_accessToken!=null)
{
StringBuffer path=httpRequest.getRequestURL();
reDirectPage="https://www.google.com/accounts/Logout?
continue=https://appengine.google.com/_ah/logout?
continue="+path;
}
response.sendRedirect(reDirectPage);
答案 8 :(得分:0)
看起来Google最近在撤消工作上遇到了麻烦(它开始为我们返回400个错误)。您现在必须致电
auth2.disconnect();
在我们的情况下,我们必须等待几秒钟才能完成断开连接调用,否则登录代码将在完成之前重新授权。如果Google从断开连接方法中返回了一个承诺,那就太好了。
答案 9 :(得分:0)
仅从使用OAuth而不是Gmail的应用程序注销:
window.gapi.load('auth2', () => {
window.gapi.auth2
.init({
client_id:
'<Your client id configired on google console>'
})
.then(() => {
window.gapi.auth2
.getAuthInstance()
.signOut()
.then(function() {
console.log('User signed out.');
});
});
});
我在ReactJs代码中使用上面的代码。
答案 10 :(得分:0)
如果有人想要用Java Here is my Answer,为此,您必须调用另一个线程。
答案 11 :(得分:0)
1. Try this code, if you are using onSignIn() function
2.
<script src="https://apis.google.com/js/platform.js?onload=onLoad" async defer></script>
<script>
function signOut() {
onLoad();
var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function () {
console.log('User signed out.');
if(auth2.isSignedIn)
{
auth2.isSignedIn.set(false);
}
});
}
function onLoad() {
gapi.load('auth2', function() {
gapi.auth2.init();
});
}
</script>