首页 文章

使用laravel socialite和jwt-auth无会话

提问于
浏览
4

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

Long Version 我正在创建一个具有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
}

My problem is, in the last block of code I am having to send the jwt to my frontend via url. Which isn't secure at all. What would be the right way to send the generated JWT to the frontend without using session. Thank you

3 回答

  • 1

    official documentation of Laravel Socialite说:

    Stateless Authentication

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

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

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

    JWTAuth::fromUser($user)
    
  • 3

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

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

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

    如果您正在Laravel中生成Angular页面(例如,不使用Laravel作为API,但是例如从 /public/index.php 显示Angular页面),则可以在视图的数据中加载带有标记的视图 .

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

  • 0

    您可以存储令牌并使用客户端重定向,而无需存储到浏览器历史记录,以将用户重定向到配置文件页面而无需URL中的令牌:

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

相关问题