41

現在、Google +サインインを自分のサイトに統合しているところです。これにより、ユーザーはTwitterやFacebookでサインインすることもできます。したがって、サイトのサインインページには、各サービスに1つずつ、合計3つのボタンがあります。

私が抱えている問題は、次のシナリオにあります。

  • ユーザーがサインインページに移動します
  • ユーザーはG+で正常にサインインします
  • ユーザーが私のサイトからサインアウトします(ただし、アカウントは引き続きG +に関連付けられています。サイトからサインアウトしても、G +アカウントは切断されません)
  • ユーザーが再度サインインページにアクセスする
  • この段階で、[G +でサインイン]ボタンが表示され、ユーザーがボタンをクリックしなくても、G+に関連付けられたアカウントにユーザーが自動的にサインインします。

問題は、サインインページに再度アクセスしたときに、G +で自動的にサインインするのではなく、別のサービスでサインインするオプションをユーザーに提供してほしいということです。ユーザーがG+でサインインしたい場合は、ボタンをクリックしてサインインできます。ユーザーは自動的にサインインします。

この自動サインオンボタンレンダリングを防ぐことは可能ですか?ボタンの属性としてを使用してシミュレートすることはできdata-approvalprompt="force"ますが、これは理想的な解決策ではないと思います(ユーザーは確認プロセスを実行する必要がありますが、これは理想的には防止したいと思います)

4

10 に答える 10

35

アップデート

自動サインインを防ぐためにサポートされている最善の方法は、gapi.auth2.getAuthInstance().signOut()呼び出された後にサイトで自動サインインを防ぐAPIメソッドを使用することです。 ここでデモ

デモでは、次のコードに示すように、ユーザーがページを離れるときにサインアウトします。

window.onbeforeunload = function(e){
  gapi.auth2.getAuthInstance().signOut();
};

これで、ユーザーがサイトを終了するたびに(たとえば、ウィンドウを閉じたり、移動したり)、ユーザーはサインアウトされ、ユーザーがクリックするまでサインインボタンはサインインをトリガーしません。

独自の実装でこれを行うことはお勧めしませんが、代わりに、ユーザーがサインインしたくないときに明示的にサインアウトできるようにします。また、私の例はデモであり、おそらくサインインしたくないことに注意してください。ユーザーがサイトを離れるたびに、ユーザーは自動的に退出します。

元の投稿

まず、data-approvalprompt = "force"を使用しないでください。これにより、追加の承認済みサブトークンがアプリケーション/クライアントに発行され、資格情報が失われた後にユーザーを再承認する必要があるシナリオで使用するように設計されています。 -側。

次に、ユーザーが既にGoogleアカウントに「サインイン」していて、再度サインイン(またはサインインをトリガー)する必要があるため、ユーザーがクリックしてサインインする必要がある動作をしたくない場合があります。 、個別に、あなたのサイトのために。

本当にこれを実行したい場合は、サインインボタンに対して明示的なレンダリングを実行しますが、ユーザーが自動的に取得しないことに気付くまで、 Google+サインインドキュメントに記載されているようにgapi.signin.renderを呼び出しません。サインインしました。

次のコードは、サインインボタンの明示的なレンダリングを有効にする方法を示しています。

<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
{"parsetags": "explicit"}
</script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<head>
<script type="text/javascript">
var token = "";
function onSigninCallbackVanilla(authResponse){
   // in a typical flow, you show disconnect here and hide the sign-in button
}

次のコードは、ボタンを明示的にレンダリングする方法を示しています。

  <span id="signinButton">
    <button id = "shim" onclick="gapi.signin.go(); $('#shim').hide();">Show the button</button>
    <span
      class="g-signin"
      data-callback="onSigninCallbackVanilla"
      data-clientid="YOUR_CLIENT_ID"
      data-cookiepolicy="single_host_origin"
      data-requestvisibleactions="http://schemas.google.com/AddActivity"
      data-scope="https://www.googleapis.com/auth/plus.login">

    </span>
  </span>  

ユーザーがサイトからサインアウトしていることを伝える方法は、サイトごとに異なる可能性がありますが、1つのアプローチは、ユーザーの「サインアウト」状態を示すCookieを設定し、これをトリガーとして使用することです。明示的なロードをブロックするため。ユーザーがサイトにアクセスしてCookieを無効にしたり、別のサインインしたブラウザーを使用したりすると、動作が少し難しくなります。これに対処するには、サインインコールバックでXHRを介してサーバーからユーザーの状態をクエリし、ユーザーがGoogle+にサインインしていることを知らないふりをするなどの複雑な操作を行うことができます。

于 2013-03-19T15:12:37.903 に答える
26

コールバック関数でg-auth-windowを確認するだけです。

    function google_sign_callback(authResult){
        if(authResult['g-oauth-window']){

        }else if(authResult['error']) {

        }
    }
于 2013-04-12T21:12:32.397 に答える
14

この問題が発生し、 auth2.disconnect()を使用しました

function onSignIn(googleUser) {
    var profile = googleUser.getBasicProfile();
    var auth2 = gapi.auth2.getAuthInstance();
    auth2.disconnect();

    //do other stuff
}

編集:切断後にid_tokenがnullになる場合があるため、切断する前にトークンを保存する必要があります。

function onSignIn(googleUser) {
    var profile = googleUser.getBasicProfile();
    var idToken=profile.id_token;
    googleUser.disconnect()

    //use idToken for server side verification
}

私が正しければ、あなたはあなたのサイトのためのあなた自身のサインインメカニズムを持っていて、確認された電子メールでユーザーをサインアップするためにグーグルサインインを必要とするだけです。この場合、プロファイル情報を取得した後、簡単に切断できます。次にページをロードすると、「サインイン」ボタンの代わりに「サインイン」ボタンが表示されます。

于 2017-11-11T07:18:23.933 に答える
3

残念ながら、呼び出しgapi.auth.signOut()によって、ユーザーデータを要求しているときにアプリが再度ログインするようになりました(どちらも永続的ではありません)

したがって、@ classによって提案されているように、解決策はトークンを取り消すことです。

  $.ajax({
    type: 'GET',
    url: 'https://accounts.google.com/o/oauth2/revoke?token=' +
        gapi.auth.getToken().access_token,
    async: false,
    contentType: 'application/json',
    dataType: 'jsonp',
    success: function(result) {
      console.log('revoke response: ' + result);
      $('#authOps').hide();
      $('#profile').empty();
      $('#visiblePeople').empty();
      $('#authResult').empty();
      $('#gConnect').show();
    },
    error: function(e) {
      console.log(e);
    }
  });
于 2014-04-14T15:25:53.073 に答える
3

私も同じ問題を抱えていますが、これが標準的な方法であるかどうかはわかりませんが、それでも問題なく動作します...

グーグル開発者からこのグーグルJSを追加します

<script src="https://apis.google.com/js/platform.js" async defer></script>
<script>

function onSuccessG(googleUser) {
        var profile = googleUser.getBasicProfile();
        console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead.
        console.log('Name: ' + profile.getName());
        console.log('Image URL: ' + profile.getImageUrl());
        console.log('Email: ' + profile.getEmail());
}
function onFailureG(error) {
    console.log(error);
}
function renderGmail() {

  gapi.signin2.render('my-signin2', {
    'scope': 'https://www.googleapis.com/auth/plus.login',
    'width': 0,
    'height': 0,
    'longtitle': true,
    'theme': 'dark',
    'onsuccess': onSuccessG,
    'onfailure': onFailureG
  });
}

次に、htmlリンクを追加し、onClickでこのrenderGmail()関数を呼び出します。

<a href="javascript:void(0)" onclick="renderGmail();"> SignUp with Gmail</a>

これがうまくいくことを願っています...

于 2015-10-20T11:13:52.930 に答える
3

https://developers.google.com/identity/sign-in/web/build-buttonを使用して、ユーザーがFacebookまたはGoogleからログインすることを選択できるWebアプリのサインインボタンを作成しています。このコードは、Id_tokenを取得するのに非常に簡単です。ただし、ユーザーがすでにサインインしている場合は、ユーザーの自動サインインも付属しています。

したがって、スクリプトの先頭に次のスニペットを追加すると、サインアップ手順を制御するのに役立ちました。

    window.onbeforeunload = function(e){
      gapi.auth2.getAuthInstance().signOut();
    };

ありがとう!

于 2017-01-01T21:52:29.593 に答える
2

AngularJSソリューションは次のとおりです。

$scope.$on('event:google-plus-signin-success', function (event, authResult) {
                if( authResult.status.method !== "AUTO"){
                    onGoogleLogIn(authResult[settings.configKeys.googleResponseToken]);
                }
            });
于 2014-12-19T00:14:51.737 に答える
1

私はしばらくこれに苦労していて、サインインの「簡単な実装」を使用してGoogleへの自動サインインを防ぐ方法を見つけることができませんでした

自動サインインを試みないカスタム統合を使用することになりました(同時に外観を変更することもできました)

于 2017-01-26T19:34:24.090 に答える
1

他のGoogleサービスでGoogleログインとOAuthアクセストークンの両方を使用し始めると、承認された回答は機能しなくなります。アクセストークンは、ユーザーがサインアウトするとすぐに期限切れになります。代わりに、このSO投稿からの回答をお勧めします。これには、クリックイベントハンドラーをGoogleのサインインボタンにアタッチすることが含まれます。ユーザーがサインインボタンをクリックしてGoogleアカウントに正常にログインすると、コールバックイベントが発生します。

于 2020-03-27T00:30:43.333 に答える
0

Googleのログインボタンにクリックハンドラーを追加することで、これを解決しました。クリックハンドラーは、グローバルJavascript変数google_sign_inをに設定しtrueます。onSuccess()ハンドラーが起動すると(ページの読み込み時に自動的に、またはユーザーがサインインボタンをクリックしたときに手動で)、最初に==かどうかを確認しgoogle_sign_intrueから、ユーザーのサインインを続行します。

<div id="google-signin2" onclick="return do_click_google_signin();"></div>

<script>
    var google_sign_in = false; // assume

    function do_click_google_signin() {
        google_sign_in = true;
    }

    function onSuccess( googleUser ) {
        if ( google_sign_in ) {
            // Process sign-in
        }
    }

    // Other redundant login stuff not shown...
</script>
于 2018-08-06T21:26:46.487 に答える