OAuth2を使用してGoogleにログインしたアプリケーションからログアウトするにはどうすればよいですか?


84

私のアプリケーションでは、jsapiを使用してGoogleサインアウトを実装しました。

URL https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxxを使用してGoogleに接続し、次にhttps://www.googleapis.com/plus/v1/people/xxxxxxを使用してユーザーデータを取得しましたグーグルプロファイルから。

次に、アプリケーションのボタンをクリックしながら、Googleからユーザーをサインアウトする必要があります。これをJavaScriptで実装するにはどうすればよいですか。少なくとも、ユーザーがサインインするたびにGoogleログインページに問い合わせる必要があります。

試しましたがapproval_prompt=force、うまくいかないようです。

回答:


244

OAuthの概要:ユーザーは彼/彼女が彼/彼女であると言っていますか?:

「LoginwithGoogle」オプションのように、OAuthを使用してStack Overflowにログインしたかどうかはわかりませんが、この機能を使用すると、StackOverflowは単にGoogleにあなたが誰であるかを知っているかどうかを尋ねます。

「グーグルよ、このビネシュ・フェラーは、vinesh.e @ gmail.comが彼だと主張している、それは本当ですか?」

すでにログインしている場合、Googleは「はい」と表示します。そうでない場合、Googleは次のように言います。

「スタックオーバーフローをちょっと待ってください。私はこの仲間を認証します。彼が自分のGoogleアカウントに適切なパスワードを入力できれば、それは彼です」。

Googleのパスワードを入力すると、GoogleはStack Overflowにあなたが本人であると伝え、StackOverflowがログインします。

アプリからログアウトするとのアプリ:

ここで、OAuthを初めて使用する開発者が少し混乱することがあります... GoogleとStackOverflow、Assembla、Vineshの-very-cool-slick-webappはすべて異なるエンティティであり、GoogleはVineshのクールなWebアプリのアカウントについて何も知りません。逆に、プロファイル情報へのアクセスに使用しているAPIを介して公開されているものは別として。

ユーザーがログアウトするとき、ユーザーはGoogleからログアウトしていないか、アプリ、Stack Overflow、Assembla、またはGoogleOAuthを使用してユーザーを認証したWebアプリケーションからログアウトしています。

実際、すべてのGoogleアカウントからログアウトしても、StackOverflowにログインできます。アプリがユーザーを認識したら、そのユーザーはGoogleからログアウトできます。Googleはもう必要ありません。

そうは言っても、あなたが求めているのは、実際にはあなたに属していないサービスからユーザーをログアウトさせることです。このように考えてみてください。ユーザーとして、Googleアカウントで5つの異なるサービスにログインした後、そのうちの1つから初めてログアウトしたときに、Gmailアカウントにログインする必要があるとしたらどの程度イライラすると思いますか。そのアプリ開発者が、自分のアプリケーションからログアウトするときに、Googleからもログアウトする必要があると判断したためです。それは本当に早く古くなるでしょう。要するに、あなたは本当にこれをしたくありません...

ええ、何でも、私はまだユーザーをグーグルからログアウトさせたいのですが、どうすればいいですか?

そうは言ってそれでもユーザーをGoogleからログアウトさたい場合で、ワークフローが中断される可能性が非常に高いことに気付いた場合は、Googleサービスのログアウトボタンの1つからログアウトURLを動的に作成し、それを使用して呼び出すことができます。 img要素またはスクリプトタグ:

<script type="text/javascript" 
    src="https://mail.google.com/mail/u/0/?logout&hl=en" />

または

<img src="https://mail.google.com/mail/u/0/?logout&hl=en" />

または

window.location = "https://mail.google.com/mail/u/0/?logout&hl=en";

ユーザーをログアウトページにリダイレクトするか、クロスドメイン制限されていない要素から呼び出すと、ユーザーはGoogleからログアウトされます。

これは必ずしもユーザーがあなたからログアウトされることを意味するわけではないことに注意してくださいアプリケーション、Googleのみ。:)

概要:

覚えておくべき重要なことは、アプリからログアウトするときに、ユーザーにパスワードを再入力させる必要がないということです。それが要点です!Googleに対して認証されるため、ユーザーは使用する各Webアプリケーションにパスワードを何度も入力する必要がありません。慣れるまでには少し時間がかかりますが、ユーザーがGoogleにログインしている限り、アプリはユーザーが本人であるかどうかを心配する必要がないことを知っておいてください。

OAuthでGoogleプロフィール情報を使用して、プロジェクトで同じ実装を行っています。私はあなたが試しているのとまったく同じことを試しましたが、Googleに何度もログインしなければならないときに人々を怒らせ始めたので、Googleからのログアウトをやめました。:)


8
貴重な時間と大きな説明をありがとうございました。しかし、私のクライアントは別の意見を持っています。ユーザーがパブリックシステムから自分のGoogleログインを使用してアプリケーションにログインし、アプリケーションからログアウトしたとします。彼はグーグルからもログアウトしたと思うかもしれませんが、実際にはそうではありません!後でシステムを使用する他のユーザーは、Googleアカウントにアクセスできます。
Vinesh EG 2012

13
次に、ユーザーもGoogleからログアウトする必要があります。重要なのは、彼らは2つのサービスにログインしているということです。ユーザーはOAuthの使用方法を学ぶ必要があります。:)クライアントとユーザーを教育することをお勧めします。必要な場合は、先に進んで見せてください。実装して、後でどれだけ問題があるかがわかったら元に戻すのにそれほど時間はかからないはずです。:)実際にこれを実行し、LoopToDoからログアウトするたびにGoogleに再度ログインする必要があるPITAの量を確認するまで、私はそれを信じていませんでした。「Vineshのクールなアプリからログアウトしました。> Googleからもログアウトすることを忘れないでください<!」というメッセージを考えてみてください。
jmort253 2012年

1
@ jmort253ええ、彼らはもう許可を与える必要がないことを理解していますが、どうすればそれらを再度認証する必要がありますか?:(私は新しいのOAuthにまだ午前)私が作ったこの質問を参照してくださいstackoverflow.com/questions/37515836/...
Apoorv Kansal

1
@ jmort253ただし、ユーザーにとって「切断」という言葉がアプリケーションからの完全なログアウトを意味する場合はどうなりますか。資格情報を再度入力せずに自動的にログインし直すため、2つの問題があります。ユーザーは、私が切断したばかりで何が起こるのか疑問に思います。情報がないはずです。認証プロバイダーが強制ログイン方法を提供しない限り、2番目のユーザーは常に自動ログインするため、別のアカウントにサインインできません。したがって、この場合、Cookieを無効にすることができ、クライアント側での管理方法について心配する必要がないように、ログアウトすることが望ましいです。
darewreck 2017年

1
これは、ユーザーがGoogleでログインするElectronアプリケーションに役立ちます。この場合、Googleからログアウトすると、1つのアプリ(Electronアプリ)からのみログアウトされます。
trusktr

21

ログアウトして、サイトに再ログインできます。

var logout = function() {
    document.location.href = "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://www.example.com";
}

1
最後に!ありがとうございました!私は...、電子メールやパスワードを知らなくても、クリックするだけで、以前のユーザーとしてログインし、次のユーザーを防ぐために、どのようにログアウトを見つけるために、一日のためにしようとしている
いくつかの

1
別のタブで同じページを開くのに十分です、そしてあなたが再びログインしているので、それは...、仕事をdoesntの
パルトロミエSemańczyk

5

私にとっては、それは機能します(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でこの関数を呼び出す必要があります


2
これが機能することは事実ですが、問題は実際にはJavaではなくJavaScriptについて尋ねています。
jmort253 2014年

2
必要なのはトークンだけだというのは気紛れに聞こえます。ブルートフォースグーグルで全員を強制的にログアウトさせることができます。
Archimedes Trajano 2014年

それはデバイスからあなたをログアウトしません、それはアプリケーション(アンドロイドで)だけをログアウトします。
Vinoj John Hosan 2014

2
いくつかのgoogleoauth2ドキュメントを見ると、典型的なアクセストークンは次のようになっています。「1 / fFAGRNJru1FTz70BzhT3Zg」「1 /」の部分は、人間が番号を簡単に識別できるようにするためのものであると想定しています。まだ2つのアルファベット(大文字と小文字)に加えて、22文字の長さの10桁の数字があります。これは22 ^(26 * 2 + 10)で、1.6990502e +83に相当します。または、既知の宇宙の原子について。HTTPを介してそれを強制する幸運の野蛮人。;)
Chris Balogh 2016年

これは、Cookieを削除する前に盗まれる可能性のある更新トークンを取り消すようには見えません(Cookieがそこに保存されている場合)。
オンドレイGalbavý


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


1
これは、ユーザーのGoogleアカウントから完全にサインアウトするわけではありません。それはAuthInstanceあなたが使用したものを破壊するだけです。あなたのソース自体は述べています...「あなたがするユーザーを有効にすることができグーグルのサインアウトしないで、あなたのアプリからログアウト...
Roshana Pitigala

@RoshanaPitigalaは、指定する回答を更新しました。この回答は質問のタイトルに対する回答ですが、質問を詳しく読むと、タイトルが間違って書かれていることがわかります。この回答は、質問のタイトルに従ってここに到達したすべての人に有効です。
CamHart

1

OuathはGoogleインスタンスをnullにするだけなので、Googleから外れます。これがアーキテクチャの作成方法です。Googleからのログアウト、アプリのログアウトは汚い作業ですが、要件で同じことが規定されている場合は役に立ちません。したがって、signOut()関数に以下を追加します。私のプロジェクトはAngular6アプリでした:

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の場合は、それを入力します。


1

このコードはサインアウトするために機能します

    <script>
      function signOut() 
      {
        var auth2 = gapi.auth2.getAuthInstance();
        auth2.signOut().then(function () {   
        console.log('User signed out.');   
        auth2.disconnect();   
      }); 
        auth2.disconnect();
      } 
    </script>

1

アプリからのみログアウトし、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コードで上記を使用しています。


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);

0

グーグルは最近彼らの取り消しのもので何かを壊したようです(それは私たちのために400のエラーを返し始めました)。あなたは今電話する必要があります

auth2.disconnect();

この場合、切断呼び出しが完了するまで数秒待つ必要があります。そうしないと、サインインコードが再承認されてから完了します。グーグルが切断方法から約束を返したならそれは良いでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.