在没有会话的情况下使用 laravel socialite 和 jwt-auth

Posted

技术标签:

【中文标题】在没有会话的情况下使用 laravel socialite 和 jwt-auth【英文标题】:Using laravel socialite and jwt-auth without session 【发布时间】:2016-06-30 03:11:03 【问题描述】:

短版:在不使用会话的情况下,将 Facebook 登录(laravel/socialite)生成的 JWT 发送到 angularjs 前端的合适方法是什么。

加长版 我正在制作一个具有 angularjs 前端和 laravel 5.2 后端的应用程序。我正在使用 tymondesigns/jwt-auth 进行身份验证而不是会话。

我还使用 laravel/socialite 进行社交 Facebook 身份验证。为此,我正在使用社交名流的无状态功能,因此我不需要任何方式的会话。

基本身份验证完美运行。但是,当我尝试使用 Facebook 登录时,我会按照以下步骤操作

    用户单击棱角侧的按钮会重定向到后端的提供商登录页面。

public function redirectToProvider() return Socialite::with('facebook')->stateless()->redirect(); 2. 用户提供他的登录信息。登录后,他被重定向到我的 handlecallback 函数。

        try 
        $provider = Socialite::with('facebook');

        if ($request->has('code')) 
            $user = $provider->stateless()->user();
        

     catch (Exception $e) 
        return redirect('auth/facebook');
    

    return $this->findOrCreateUser($user);

    接下来我使用 findorcreate 函数来判断用户是否存在。如果不是,我只是创建一个新用户并从中创建 JWT。

        $user = User::where('social_id', '=', $facebookUser->id)->first();
    
    if (is_object($user)) 
        $token = JWTAuth::fromUser($user);
        return redirect()->to('http://localhost:9000/#/profile?' . 'token=' . $token);#angular 
     else 
        $result = array();
        $result['name'] = $facebookUser->user['first_name']
        $result['email'] = $facebookUser->user['email'];
        $result['social_id'] = $facebookUser->id;
        $result['avatar'] = $facebookUser->avatar;
        $result['gender'] = $facebookUser->user['gender'];
        $result['status'] = 'active';
        $result['login_type'] = 'facebook';
        $result['user_type'] = 'free_user';
    
        try 
            $user = User::create($result);
         catch (Exception $e) 
            return response()->json(['error' => 'User already exists.'], HttpResponse::HTTP_CONFLICT);
        
        $token = JWTAuth::fromUser($user);
        return redirect()->to('http://localhost:9000/#/profile?' . 'token=' . $token);#angular
    
    

我的问题是,在最后一段代码中,我必须通过 url 将 jwt 发送到我的前端。这根本不安全。在不使用会话的情况下将生成的 JWT 发送到前端的正确方法是什么?谢谢

【问题讨论】:

您解决了吗?同样的问题也出现在我们的应用程序中。 在 cookie 中存储令牌也不是一个坏主意。在您的回调处理程序中,您应该设置一个带有令牌的 cookie。 【参考方案1】:

official documentation of Laravel Socialite 说:

无状态身份验证

stateless 方法可用于禁用会话状态验证。这在向 API 添加社交身份验证时很有用:

return Socialite::driver('google')->stateless()->user();

然后,您可以使用jwt-auth 方法进行身份验证:

JWTAuth::fromUser($user)

【讨论】:

【参考方案2】:

如果您在 Angular 端使用 $http,请尝试将令牌作为来自 Laravel 的 JSON 响应返回:

return response()->json(compact('token'));

然后将令牌存储在localStoragesessionStorage 或你有什么。

如果你在 Laravel 中生成 Angular 页面(例如,不使用 Laravel 作为 API,而是从 /public/index.php 显示你的 Angular 页面),你可以使用视图数据中的令牌加载视图.

只要您使用 HTTPS,这两种情况中的任何一种都比在重定向 URL 中传递令牌更好。

【讨论】:

感谢您的回复。 Laravel 被用作 API。当用户进入 facebook 登录页面时,他已经离开了 angular 站点。因此,将令牌作为响应返回不会到达角度侧。【参考方案3】:

您可以存储令牌并使用客户端重定向,而无需存储到浏览器历史记录,以将用户重定向到 URL 中没有令牌的个人资料页面:

document.location.replace(profile-url)

【讨论】:

以上是关于在没有会话的情况下使用 laravel socialite 和 jwt-auth的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用请求的情况下删除 Laravel 5.3 中的会话?

调试会话在没有暂停的情况下完成

没有 cookie 的 Laravel 会话

不同的会话驱动程序取决于 Laravel 中的路线

如何在没有典型 laravel /login 的情况下使用 laravel sanctum

在没有 Laravel 的情况下使用 Laravel 数据库迁移和种子 [关闭]