В моем случае, пользователь вошел в систему на моем веб-сайте 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
, вы можете аутентифицироваться в паспорте!