如何检查用户是否仍在登录Google?

时间:2018-10-07 12:31:26

标签: laravel-5 google-oauth2 laravel-socialite

我正在通过Laravel Socialite使用Google OAuth对我的Web应用程序中的所有用户进行身份验证。

如果用户退出自己的Google帐户,我需要尽快结束用户会话。

我正在尝试建立一个中间件,如果用户仍然使用google登录,它将执行常规检查。但是我找不到办法问“ user@example.com仍然是google上的当前用户吗?”

我试图在中间件中使用\Socialite::driver('google')->user(),但如果不事先重​​定向到google,这似乎无法正常工作。我希望此检查尽快完成。它也应该在后台ajax调用期间工作。

使用客户端身份验证似乎很简单,因为存在gapi.auth2.init().isSignedIn.get()。但是,这意味着我不得不向用户要求两个授权(服务器端和客户端),这似乎是错误的。

看着the docs at google,除了重新认证外,我什么都看不到。访问令牌在注销时不会过期...有解决方法吗?

1 个答案:

答案 0 :(得分:1)

事实证明,我们实际上可以将gapi javascript与Socialite一起使用-只需使用相同的客户端令牌即可。我不怀疑我会获得所有信息而无需分别登录浏览器会话,但是它可以工作。

我在主刀片模板的末尾添加了以下代码,以检查授权用户的状态。

@auth
<script>
    var currentUserEmail = '{{Auth::user()->email}}';  // user "sameness" criterion
    var googleClientId = '{{env('GOOGLE_ID')}}';  // the same oauth client id
</script>
<script src="https://apis.google.com/js/platform.js"></script>
<script src="{{mix('js/checkGoogleAuth.js')}}"></script>
@endauth

那么脚本checkGoogleAuth很简单,我复制了Google教程并缩短了它:

var auth2; // The Sign-In object.
var googleUser; // The current user.

/**
 * Initializes Signin v2 and sets up listeners.
 */
var initSigninV2 = function() {
  auth2 = gapi.auth2.init({
      client_id: googleClientId,
      scope: 'profile'
  });

  // Listen for sign-in state changes.
  auth2.isSignedIn.listen(checkState);
  auth2.currentUser.listen(checkState);
};

var checkState = function (user) {
    //if signed out or changed user
    if (!auth2.isSignedIn.get() || currentUserEmail != auth2.currentUser.get().getBasicProfile().getEmail())
        $('.logout-username').click();  //click logout button
};

gapi.load('auth2', initSigninV2);  //launch it

我希望它也能帮助其他人!