简短的版本:什么是适当的方式发送从Facebook登录生成的JWT(laravel/社会名流)到angularjs前端不使用会话。
长版本我正在制作一个应用程序,有angularjs前端和laravel 5.2后端。我使用tymonDesign/jwt-auth进行身份验证,而不是会话。
我还使用laravel/socialite进行社交Facebook身份验证。为此,我使用社交名流的无状态特性,这样我就不需要任何形式的会话。
基本的身份验证工作得很好。但是,当我尝试使用Facebook登录时,我遵循以下步骤
公共函数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发送到前端的正确方法是什么。非常感谢。
Laravel社交名流的官方文件中说:
无状态身份验证
无状态
方法可用于禁用会话状态验证。这在向API添加社交身份验证时很有用:
return Socialite::driver('google')->stateless()->user();
然后,您可以使用jwt-auth
方法进行身份验证:
JWTAuth::fromUser($user)
如果您在Angular端使用$超文本传输协议
,请尝试从Laravel返回令牌作为JSON响应:
return response()->json(compact('token'));
然后将令牌存储在localStorage
或sessionStorage
或您拥有的任何内容中。
如果您是从Laravel中生成角度页面(例如,不使用Laravel作为API,而是从/public/index.php
显示角度页面),您可以在视图的数据中加载带有标记的视图。
只要您使用HTTPS,这两种方案中的任何一种都比在重定向URL中传递令牌要好。
您可以存储令牌并使用客户端重定向(无需存储到浏览器历史记录)将用户重定向到配置文件页面(URL中无令牌):
document.location.replace({profile-url})