我正在通过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,除了重新认证外,我什么都看不到。访问令牌在注销时不会过期...有解决方法吗?
答案 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
我希望它也能帮助其他人!