Как проверить, вошел ли пользователь в Google? - PullRequest
0 голосов
/ 07 октября 2018

Я использую Google OAuth через Laravel Socialite для аутентификации всех пользователей в моем веб-приложении.

Мне нужно, чтобы сеанс пользователя завершался как можно скорее, если пользователь выходит из своей учетной записи Google.

Я пытаюсь настроить промежуточное программное обеспечение, которое будет выполнять регулярные проверки, если пользователь все еще входит в Google.Но я не могу найти способ спросить «Является ли user@example.com по-прежнему текущим пользователем в Google?»

Я пытался получить \Socialite::driver('google')->user() в промежуточном ПО, но, похоже, это не работает безсделать перенаправление в Google заранее.Я бы хотел, чтобы эта проверка была максимально быстрой и ненавязчивой.Он также должен работать во время фонового вызова ajax.

Кажется, что было бы тривиально с использованием аутентификации на стороне клиента, так как gapi.auth2.init().isSignedIn.get().Однако это означало бы, что я должен запросить у пользователей две авторизации (на стороне сервера и на стороне клиента), что кажется неправильным.

Глядя на документы в Google , я не вижу ничего, что позволило бы мнепроверять их статус аутентификации отдельно от повторной аутентификации.Маркер доступа не истекает при выходе из системы ... Есть ли обходной путь?

1 Ответ

0 голосов
/ 11 октября 2018

Оказывается, что на самом деле мы можем использовать 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

Надеюсь, это поможет и кому-то еще!

...