使用laravel socialite和jwt-auth无会话

时间:2016-03-14 21:25:42

标签: laravel authentication oauth jwt

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

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

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

基本身份验证功能完美。但是,当我尝试使用Facebook登录时,我会按照这些步骤进行操作

  1. 用户点击角度侧的按钮,该按钮会重定向到后端的提供者登录页面。
  2. 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);
    
    1. 接下来,我使用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
      }
      
    2. 我的问题是,在最后一段代码中,我必须通过url将jwt发送到我的前端。这根本不安全。在不使用会话的情况下将生成的JWT发送到前端的正确方法是什么。谢谢

3 个答案:

答案 0 :(得分:4)

official documentation of Laravel Socialite说:

无状态身份验证

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

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

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

JWTAuth::fromUser($user)

答案 1 :(得分:2)

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

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

然后将令牌存储在localStoragesessionStorage或您拥有的内容中。

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

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

答案 2 :(得分:0)

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

document.location.replace({profile-url})