提问者:小点点

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


简短的版本:什么是适当的方式发送从Facebook登录生成的JWT(laravel/社会名流)到angularjs前端不使用会话。

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

我还使用laravel/socialite进行社交Facebook身份验证。为此,我使用社交名流的无状态特性,这样我就不需要任何形式的会话。

基本的身份验证工作得很好。但是,当我尝试使用Facebook登录时,我遵循以下步骤

  1. 用户单击角侧的按钮,该按钮将重定向到后端的提供商登录页面。

公共函数reDirectToProvider(){返回社会化e::('facebook')-

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

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

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

    return $this->findOrCreateUser($user);

接下来,我使用findor创建函数来确定用户是否存在。如果没有,我只是创建一个新用户,并从中创建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发送到前端的正确方法是什么。非常感谢。


共3个答案

匿名用户

Laravel社交名流的官方文件中说:

无状态身份验证

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

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

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

JWTAuth::fromUser($user)

匿名用户

如果您在Angular端使用$超文本传输协议,请尝试从Laravel返回令牌作为JSON响应:

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

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

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

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

匿名用户

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

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