LoginUsingId的Laravel问题(手动验证)

ome*_*ooq 13 laravel laravel-5 laravel-5.3

我正在尝试在多个域上实现单点登录.这个概念非常简单,即发送唯一的用户令牌,然后验证这些令牌以找到用户,然后将其登录.

现在在验证令牌然后抓住用户之后,我做了类似的事情

$loggedInUser = Auth::loginUsingId($user->id, true);
Run Code Online (Sandbox Code Playgroud)

现在我有一个自定义中间件,它首先检查登录用户,即

Auth::Check()
Run Code Online (Sandbox Code Playgroud)

以上工作首次正常.但是刷新时Auth :: check()没有经过验证.我也尝试使用所有不同的会话驱动程序,但仍然无法正常工作.

我在laravel 5.2上使用了类似的代码,它确实有效.但是在laravel 5.3上它没有验证持久性请求.

编辑:让我告诉你我的代码 我没有修改AuthServiceProvider或任何其他警卫.我在目录中有用户模型,但我修改了auth.php中的路径.

这是domain1指向的路线:

http://domain2.com/ {{$ role}}/{{$ route}}/singlesignon/{{$ token}}

然后通过loginController中的verifySingleSignOn方法获取它,该方法接收用户从其他域进入的角色和路由以及令牌.然后,用户将重定向到相同的路由,但在domain2上.在这里,我可以在手动登录之前成功接收用户ID.

public function verifySingleSignOn($role, $route, $token)
    {
        // Fetch Single Signon
        $userRepository = new UserRepository();
        $user = $userRepository->checkForSingleSignOnToken($token, ['id']);

        // Check if Token Exists
        if (isset($user->id) && is_int($user->id) && $user->id != 0) {

            // Manually Logging a user (Here is successfully recieve the user id)
            $loggedInUser = Auth::loginUsingId($user->id);

            if (!$loggedInUser) {
                // If User not logged in, then Throw exception
                throw new Exception('Single SignOn: User Cannot be Signed In');
            }
            $redirectTo = $role . '/' . $route;
            return redirect($redirectTo);
        } else {
            return Auth::logout();
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我有这个GlobalAdminAuth中间件

   // Check if logged in
    if( Auth::Check() ){
        $user = Auth::User();

        // Check if user is active and is a globaladmin
        if( !$user->isGlobalAdmin() || !$user->isActive() ){
            return redirect()->guest('login');
        }
    }else{
        return redirect()->guest('login');
    }

    return $next($request);
Run Code Online (Sandbox Code Playgroud)

现在第一次一切正常,用户成功地通过中间件.但是第二次触发了else语句.

编辑:checkForSingleSignOnToken的代码

public function checkForSingleSignOnToken($token, $columns = array('*'))
{
    return User::where('single_signon', $token)->first($columns);
}
Run Code Online (Sandbox Code Playgroud)

小智 6

尝试

Auth::login($user);

代替

Auth::loginUsingId($user->id, true);
Run Code Online (Sandbox Code Playgroud)


Man*_*nan 2

Cookie 受域限制。您的应用程序domain1.com将无法获取由 设定的cookie domain2.com

您应该自定义防护以使用 cookie 之外的其他机制。也许在查询参数中使用令牌。