当前位置: 首页 > 知识库问答 >
问题:

在哪里存放JWT

贺跃
2023-03-14

我刚刚开始阅读JWT,我相信我理解什么是JWT代币。我对会话也相当熟悉。我相信我了解每种方法的优点和缺点。然而,有几个部分我感到困惑。

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

1)您如何存储您的JWT令牌以及在哪里。根据我所读到的,我知道您向服务器发送身份验证请求,如果您成功进行身份验证,服务器会向您发送JWT令牌。然后你会怎么做?,你会像我在一些网站上读到的那样将JWT存储在cookie中吗?如果是这样,你是怎么做到的(使用php,使用javascript)。你是怎么读的。

2) 在使用会话时,或多或少您只需检查是否有会话来检查用户是否登录。在使用JWT时,如何实现这一点。

我在一些页面上也看到了这一点:

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

这和这有什么关系(如果有关系的话)

共有3个答案

潘志国
2023-03-14

在我的情况下,我使用使用照明\基金会\Auth\身份验证用户;使用JWTAuth;在我的LoginController中使用Tymon\JWTAuth\Exceptions\JWTExc0019;。然后我需要像这样得到我的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);
  }

当然,如果我没有得到令牌,我会做更多的事情。就我而言,我是这样说的:

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中做的事情,我也有一个中间件,我有一个函数来处理刷新页面后的行为等等。

“我的。auth'=

我还在javaScript的localStoragevuex存储中处理大量的sessionStorage。在网站中定义路线。phpapi。php我现在将使用我在中间件之前定义的类路由::组(['middleware'=

一些帮助我的资源:LaravelCookies,LaravelSession

希望你能得到一些灵感来创作你的JWTauth。

相高谊
2023-03-14

JWT主要是一种在restapi上对用户进行身份验证的方法,正如您所说的,您可以将其发送到客户机,而无需将其存储在会话中。

但是,如果您正在制作一个浏览器应用程序,我不认为有必要使用JWT身份验证,因为您可以使用会话和cookie来实现这一点。

JWT主要用于那些情况,例如,当您有一个移动应用程序前端时,不建议维护会话,而且可能不可能。

但是,如果您正在制作一个混合应用程序,那么将其存储在“浏览器”的本地存储中是一个不错的选择。JWT从不存储在服务器端。

呼延明朗
2023-03-14

>

  • 从客户端来看,好的做法是将JWT存储在cookie中,模式为http_only=true,是安全的(因此只能通过https发送),因此javascript无法访问JWT。那么,我们就不用担心XSS附加了。

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

    这就像政府给公民的护照,数据(有效载荷)对每个人来说都是可读的,但签名只能由政府创建,它可以验证这一点。

  •  类似资料:
    • 问题内容: 我的项目是这样的: 有人可以告诉我将hibernate.cfg.xml放在哪里吗? 因为出现此错误: 问题答案: 配置文件必须位于上。 根据您的项目,这可以通过不同的方式来完成。 对于 Web应用程序WAR 项目(您正在Servlet容器中运行程序):当应用程序在容器中运行时,将其放入将在类路径上可见的文件中起作用。 对于 Maven的 风格的项目(在Servlet容器没有运行该程序)

    • 问题内容: 我使用Eclipse(3.4),并且类编译时没有警告或错误。我的项目使用一个外部jar文件。 为了从另一个项目(不在Eclipse中)使用此类时,我需要在哪里放置此外部jar文件? 我可以将jar提取到项目文件夹中,但是感觉不对。 编辑:这个问题不是关于在Eclipse中导入jar,而是在Eclipse之外使用它们。 问题答案: 如果要在Eclipse项目中包含JAR文件,通常可以在项

    • 问题内容: hibernate注释应该放在哪里? 它是我的实例变量上方的线吗?还是在吸气剂之前?还是在二传手之前?还是真的不重要吗? 非常感谢 问题答案: 您可以将它们放在 野外 或 吸气剂上 。从《 Hibernate注释参考指南》中: 2.2.1。将POJO标记为持久实体 (…) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上

    • 问题内容: 休眠注释应该放在哪里? 它是我的实例变量上方的线吗?还是在吸气剂之前?还是在二传手之前?还是真的不重要吗? 非常感谢 问题答案: 您可以将它们放在 野外 或 吸气剂上 。从《 Hibernate注释参考指南》中: 2.2.1。将POJO标记为持久实体 (…) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上声明注释,即,

    • 问题内容: 在Hibernate 4.x中,我曾按如下方式生成和导出在带注释的实体中定义的架构(使用Spring在类路径上查找带注释的实体): 这在Hibernate 5.0中不再起作用: 不复存在 该构造函数现在已不 除以下内容外,我在迁移指南中没有发现任何明显的参考资料: 从配置中删除了很多方法 基于一组带注释的实体,在与Hibernate 5.0 的现有JDBC连接上 生成和导出数据库的正确

    • 我正在尝试运行Phusion Passenger,这是我得到的最远的。当它在网站上加载时,它就出现了 需要“rails/all”。。。0.550s捆扎机。要求1.510s[已弃用]I18n。enforce\u available\u locales将来将默认为true。如果确实要跳过区域设置的验证,可以设置I18n。强制\u available\u locales=false以避免此消息。应用初始