在哪里存放JWT

时间:2017-11-07 06:52:51

标签: javascript jwt

我几乎没有开始阅读有关JWT的内容,而且我明白我了解JWT令牌是什么。我对SESSIONS也很熟悉。我相信我理解每个人的优点以及他们的缺点。但是,有几个部分我很困惑。

在请求受保护资源时,您需要在每个请求上发送jwt,而不是在服务器上存储会话。但是:

1)如何存储JWT令牌以及在哪里。从我读到的内容中我了解到,您发送了对服务器进行身份验证的请求,如果您成功通过身份验证,服务器会向您发送JWT令牌。那么你做了什么?,你是否将JWT存储在cookie中,就像我在某些网站上看到的一样?如果是这样,你怎么做(使用PHP,使用JavaScript)。你怎么读它。

2)使用会话时,或多或少只会检查是否存在会话以检查用户是否已登录。如何在使用JWT时完成此操作。

我也在某些页面上看到过这个:

RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

这与此有何关系(如果相关的话)

4 个答案:

答案 0 :(得分:1)

  1. 从客户端来看,好的做法是将JWT存储在cookie中,模式为http_only = true,is_secure(因此只通过https发送),因此javascript无法访问JWT。然后,我们不担心XSS附加。

  2. 我们不需要在服务器端存储会话。 JWT包含两部分,有效载荷数据和签名,由存储在服务器端的密钥签名,只有服务器才能知道。当我们从客户端收到令牌时,我们检查有效负载数据是否有效(用户信息,谁分配了该令牌,将该令牌分配给谁,哪些角色授予了令牌,过期时间),我们检查签名是否有效确保令牌是由服务器分配的,而不是伪造的。然后将对用户进行身份验证。

  3. 这就像政府给予其公民的护照,数据(有效载荷)对每个人都是可读的,但签名只能由政府创建,并且可以对此进行验证。

答案 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 sessionStoragevuex中处理了很多事情。要在routesweb.php中定义api.php,请立即使用我在 middleware之前的Route::group(['middleware' => 'my.auth'], function(){...}

帮助我的一些资源: LaravelCookiesLaravelSession

希望您能够获得创建JWT身份验证的灵感。

答案 3 :(得分:0)

您可以找到有关https://www.youtube.com/watch?v=2PPSXonhIck的更多信息 在此视频中,作者介绍了用于存储,会话和JWT的各种选项。 希望对您有帮助。