【问题标题】:How to get data from JWT if didn't have users table in laravel?如果 laravel 中没有用户表,如何从 JWT 获取数据?
【发布时间】:2018-08-17 15:09:42
【问题描述】:

我尝试实现微服务架构。因为我是新手,也许有人可以告诉我: - 当有人登录一项服务时,我可以使用 JWT 与服务进行通信吗?这是安全的方式还是有更好的方式? - 我如何解析 JWT 并从中获取用户 ID 或其他一些数据以将其用于没有用户表的其他服务?比如它是否已过期,用户 ID...

如果有人能帮我给我一个方向,谢谢你的战利品。

【问题讨论】:

  • 你有一些代码可以看一下吗?
  • 代码还没有写,因为我不知道这是可能的,是好的方向。 JWT 将在一个带有 laravel 护照的微服务中生成,我问的是在微服务之间的通信上使用 JWT 是安全的,以及如何从该 JWT 获取用户 ID 和一些更多数据,如组织 ID .. 因为在其他微服务中我没有像我在第一个中一样拥有用户表或身份验证过程。

标签: laravel jwt microservices


【解决方案1】:

我偏爱tymon/jwt-auth 包,它主要在引擎盖下使用'namshi/jose'。只要jwt.secret在每个可能需要使用令牌的系统之间是相同的,你应该可以调用JWTAuth::getPayload($token)->toArray()来解码它们。

您确实需要一个用户表,但它不必是 Laravel 中已经指定的 用户表。任何实现Illuminate\Auth\Authenticatable 接口的模型,例如通过扩展Illuminate\Foundation\Auth\User 模型都可以。

如果您想在验证登录凭据的用户表之外向令牌中注入其他数据,只需添加一个数组作为登录尝试的第二个参数:

//The key names here are defined by the return values of methods described in the Authenticatable interface.
$credentials = [
    'username' => 'your_user',
    'password' => 'your_password'
];
$customClaims = [
    'someOtherDatapoint' => 'more_data'
];
$token = JWTAuth::attempt($credentials, $customClaims);

您也可以不经过身份验证直接进入令牌创建:

$user = app(YourUserModel::class)->first($id);
$token = JWTAuth::fromUser($user, $customClaims);

这是相对安全的,但我不确定这是否是传输加密数据的最佳方式。您可能只想使用基于 APP_KEY 的 encrypt()decrypt() 辅助函数。您还可以查看 Laravel-Passport https://laravel.com/docs/5.6/passport 进行身份验证,它使用 OAuth2。

【讨论】:

  • 谢谢@Claymore 我想在 oath 服务器中添加护照,这将生成 JWT,我将使用它与不同服务器中的其他服务进行通信。我只是想找出验证令牌以能够从其他服务访问资源的最佳方法,我不希望没有访问权限的人访问某些信息或数据。
  • 我并不是说通过 Passport 的 OAuth2 会产生 JWT 令牌。 Oauth2 和 JWT 的相似之处在于它们都使用“不记名令牌”。并且它们都用于身份验证。但它们是获得这种行为的完全不同的方法。您可以将 JWT 视为会话 cookie 的替代品,它通常由没有真正拥有自己后端的“单页应用程序”使用。而 OAuth2 是一种处理身份验证授权的方法。在任何一种情况下,我都不会将加密的表单数据附加到不记名令牌上。只需提出单独的请求即可。
猜你喜欢
  • 2016-07-18
  • 2020-03-17
  • 2020-11-01
  • 2018-05-21
  • 2017-08-12
  • 2021-11-29
  • 2020-10-26
  • 1970-01-01
  • 2021-11-29
相关资源
最近更新 更多