我想在master.example.com主服务中使用拉拉/护照 auth2身份验证:用户登录到,然后单击“转到模块一”按钮。然后,将其重定向到分离角应用程序moduleOne.example.com,该应用程序使用主 restfulAPI。
moduleOne可以检测到用户已登录到主,并以该用户使用oauth2的身份自动登录到restfulAPI (因此用户不需要键入两次凭据)?该怎么做呢?
发布于 2019-03-25 17:28:26
在我的例子中,用户登录到了我的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,可以对护照进行身份验证!
https://stackoverflow.com/questions/55342207
复制相似问题