验证登录到不同子域的用户

时间:2019-03-25 16:20:19

标签: php angular laravel

我想在 master 服务中使用laravel/passport auth2身份验证:用户登录 master.example.com ,然后单击“转到模块1”。 ”按钮。然后,他被重定向到 moduleOne.example.com ,它是使用 master restfulAPI的独立角度应用程序。

moduleOne 可以检测到该用户已登录 master ,并使用 oauth2 以该用户的身份自动登录到restfulAPI(因此该用户不需要两次输入凭据)?怎么做?

1 个答案:

答案 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,您可以对护照进行身份验证!