我几乎没有开始阅读有关JWT的内容,而且我明白我了解JWT令牌是什么。我对SESSIONS也很熟悉。我相信我理解每个人的优点以及他们的缺点。但是,有几个部分我很困惑。
在请求受保护资源时,您需要在每个请求上发送jwt,而不是在服务器上存储会话。但是:
1)如何存储JWT令牌以及在哪里。从我读到的内容中我了解到,您发送了对服务器进行身份验证的请求,如果您成功通过身份验证,服务器会向您发送JWT令牌。那么你做了什么?,你是否将JWT存储在cookie中,就像我在某些网站上看到的一样?如果是这样,你怎么做(使用PHP,使用JavaScript)。你怎么读它。
2)使用会话时,或多或少只会检查是否存在会话以检查用户是否已登录。如何在使用JWT时完成此操作。
我也在某些页面上看到过这个:
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
这与此有何关系(如果相关的话)
答案 0 :(得分:1)
从客户端来看,好的做法是将JWT存储在cookie中,模式为http_only = true,is_secure(因此只通过https发送),因此javascript无法访问JWT。然后,我们不担心XSS附加。
我们不需要在服务器端存储会话。 JWT包含两部分,有效载荷数据和签名,由存储在服务器端的密钥签名,只有服务器才能知道。当我们从客户端收到令牌时,我们检查有效负载数据是否有效(用户信息,谁分配了该令牌,将该令牌分配给谁,哪些角色授予了令牌,过期时间),我们检查签名是否有效确保令牌是由服务器分配的,而不是伪造的。然后将对用户进行身份验证。
这就像政府给予其公民的护照,数据(有效载荷)对每个人都是可读的,但签名只能由政府创建,并且可以对此进行验证。
答案 1 :(得分:0)
JWT主要是一种在其他API上对用户进行身份验证的方法,就像你说的那样,你将它发送给客户端,并且它无需将其存储在会话中。
但是,如果您正在制作浏览器应用程序,我不会发现需要使用JWT身份验证,因为您可以使用会话和cookie来执行此操作。
JWT主要用于那些情况,例如,当你有一个移动应用程序前端时,不建议维护会话,也许不可能。
但是,如果您正在制作混合应用程序,则将其存储在"浏览器的本地存储中。是要走的路。 JWT永远不会存储在服务器端。
答案 2 :(得分:0)
在我的情况下,我在LoginController中使用use Illuminate\Foundation\Auth\AuthenticatesUsers;
,use JWTAuth;
和use Tymon\JWTAuth\Exceptions\JWTException;
。然后我需要得到JWTToken
那样的
use AuthenticatesUsers;
try {
$token = JWTAuth::attempt($request->only('username', 'password'), [
'exp' => Carbon::now()->addWeek()->timestamp,
]);
} catch (JWTException $e) {
return response()->json([
'error' => 'Could not authenticate: ' . $e.message,
], 500);
}
因为如果我没有得到token
,我会做更多事情。就我而言,我是这样的:
if (!$token) {
return response()->json([
'error' => 'Could not authenticate.'
], 401);
} else {
$data = [];
$meta = [];
//all what i need from users table if auth
$data['id'] = $request->user()->id;
$data['email'] = $request->user()->email;
$meta['token'] = $token;
//now comes the part, where I set my sessions:
Session::put('auth-user', (array)$request->user());
Session::put('jwt-token', $token);
Session::save();
return response()->json([
'data' => $data,
'meta' => $meta
])->withCookie('jwt-token', $token, config('jwt.ttl'), '/', null, true, true);
}
这实际上就是我在LoginController
中所做的事情我也有一个middleware
我有一个函数来处理刷新页面之后的行为等等。
'my.auth' => \App\Http\Middleware\MyAuth::class
我还在localStorage
商店的javaScript sessionStorage
和vuex
中处理了很多事情。要在routes
或web.php
中定义api.php
,请立即使用我在
middleware
之前的Route::group(['middleware' => 'my.auth'], function(){...}
帮助我的一些资源: LaravelCookies,LaravelSession
希望您能够获得创建JWT
身份验证的灵感。
答案 3 :(得分:0)
您可以找到有关https://www.youtube.com/watch?v=2PPSXonhIck的更多信息 在此视频中,作者介绍了用于存储,会话和JWT的各种选项。 希望对您有帮助。