我想在 master 服务中使用laravel/passport auth2身份验证:用户登录 master.example.com ,然后单击“转到模块1”。 ”按钮。然后,他被重定向到 moduleOne.example.com ,它是使用 master restfulAPI的独立角度应用程序。
moduleOne 可以检测到该用户已登录 master ,并使用 oauth2 以该用户的身份自动登录到restfulAPI(因此该用户不需要两次输入凭据)?怎么做?
答案 0 :(得分:1)
在我的情况下,用户已登录我的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
,您可以对护照进行身份验证!