Аутентифицировать пользователя, вошедшего в другой поддомен - PullRequest
1 голос
/ 25 марта 2019

Я хочу использовать laravel / passport auth2 аутентификация в сервисе master : войдите в master.example.com , а затем нажмите «перейти кМодуль один "кнопка.Затем он перенаправляется на moduleOne.example.com , который является отдельным угловым приложением, использующим master restfulAPI.

moduleOne может обнаружить, что пользователь вошел в систему master , и автоматически войти в restfulAPI от имени этого пользователя, используя oauth2 (таким образом, пользовательне нужно вводить учетные данные дважды)?Как это сделать?

1 Ответ

1 голос
/ 25 марта 2019

В моем случае, пользователь вошел в систему на моем веб-сайте Laravel, и мне пришлось зарегистрировать того же пользователя в расширении Chrome (которое является клиентом того же приложения - авторизация через паспорт) с тем же пользователем.

Сначала я создал представление для iframe.

Route::get('/login-iframe', 'ExtensionAuthController@index');

В моем методе, как я знал вошедшего в систему пользователя, я передал его представлению, а также только что созданному access_token.

public function index() {
    $user = Auth::user();

    if (!$user) {
        return view('iframe')->with(['user' => null]);
    } else {
        $token = $user->createToken('extension')->accessToken;

        return view('iframe')->with([
            'user' => $user,
            'access_token' => $token
        ]);
    }
}

Затем в iframe.blade.php это простой html-файл:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
  </head>
</html>
<body>
   <script>
       window.onload = function () {
           @if ($user)
               var user = '{!! $user !!}';
               var token = '{{ $access_token }}';
               parent.postMessage({connectStatus:"connected", user:"" + user + "", accessToken:"" + token + ""}, "*");
           @else
               parent.postMessage({connectStatus:"needs-auth"}, "*");
           @endif
       };
   </script>
</body>

В приведенном выше блоке parent.postMessage() позволяет вам общаться с родителем.

В своем интерфейсе я использовал немного логики, но на самом деле упростил ее:

let iframeUrl = 'directUrlHere';

let elt = document.createElement('iframe');
elt.id = 'auth_iframe';  // I have a css rules for hiding it
elt.src = iframeUrl;
document.getElementsByTagName('body')[0].appendChild(elt);

let eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
let eventer = window[eventMethod];
let messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";

eventer(messageEvent,function(e) {
    console.log(e);
    if (e.data.connectStatus !== 'connected') {
         // not logged in so show login screen
         return;
    }

    let user = JSON.parse(e.data.user);
    let accessToken = e.data.accessToken;
}); 

Теперь, используя accessToken, вы можете аутентифицироваться в паспорте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...