【问题标题】:Laravel Passport good practices for issuing multiple tokensLaravel Passport 发行多个令牌的良好实践
【发布时间】:2019-08-11 16:16:09
【问题描述】:

我对 Laravel Passport 以及管理 api access_tokens 的最佳方式有疑问。

目前我们有:

  • grant_type: password 发出且没有范围的令牌:
      $data = [
           'grant_type' => 'password',
           'client_id' => $client_id,
           'client_secret' => $client_secret,
           'username' => $user->email,
           'password' => $user->password,
           'scope' => '',
       ];
    
  • 一个仅用于查看用户图片的令牌,方法如下:
    $token = $user->createToken('User Picture token', ['view-picture'])->accessToken;
    

grant_type: password发布的第一个令牌将仅用于获取个人用户信息。

这是一个好习惯吗?

我们希望限制对资源的访问,如下所示: 一种“消息”资源,包含对其访问令牌的 CRUD 操作,具有特定范围。

所以我们希望每个资源由不同的令牌和不同的范围保护。

个人 access_token 是用来做的吗?

编辑 1:

为了管理用户权限,我们使用 Laravel 的 Gates & Policies。

【问题讨论】:

  • 也许你可以使用像spatie/laravel-permission 这样的包来处理你的 Laravel 应用程序中的权限?你到底需要令牌做什么?
  • @DeesOomens 感谢您的回复,我需要令牌来验证用户,但有时令牌会传递给 DOM,就像这样:<img src="https://domain/picture?token=eyaehzaoe" />
  • 在我们的应用中,我们已经使用 laravel 的 Gates & Policies 来管理用户权限

标签: laravel laravel-passport


【解决方案1】:

Laravel Passport 让您能够在几分钟内实现完整的 Oauth2 服务器。这意味着,您可以安装一个完整的服务器,不仅可以管理对您自己的应用程序的访问,还可以管理第三方应用程序的访问。

当我说“你自己的应用”时,我指的是由你和/或你的团队开发的那些。 “第三方应用程序”是指由有权访问您的 API 的其他开发人员开发的应用程序。令牌范围是限制此第三方应用可以代表您的用户执行的操作的好方法。

以 Facebook 为例。如果您想通过 Facebook 在您的应用中实现访问,您的用户将需要允许您的应用访问他们的个人资料数据,以便检索他们的详细信息以有效地登录您的系统。

来自Passport documentation

令牌范围

范围允许您的 API 客户端在请求授权访问帐户时请求一组特定的权限。例如,如果您正在构建电子商务应用程序,则并非所有 API 使用者都需要下订单的能力。相反,您可以只允许消费者请求授权以访问订单发货状态。换言之,范围允许您应用程序的用户限制第三方应用程序可以代表他们执行的操作

现在,如果您的 API 将仅由您的应用使用,我的意思是,如果您不打算向除您的团队以外的任何人公开或公开您的 API 蓝图,您只需授权用户具有角色和权限和/或实施 Laravel Gates/Policies。

然后您可以通过令牌识别用户并检查用户是否具有正确的权限/角色来执行特定操作或访问某些数据(或部分数据)。

【讨论】:

  • 感谢您的回复,但正如我所说,我认为只有一个令牌可能很危险,因为我需要在 DOM 中传递令牌,例如:<img src="https://example.com/picture?token=aert />,所以您认为创建一个仅用于图片资源的令牌是一种好习惯吗?
  • 就是这样。如果用户访问您的令牌,您不必担心。归根结底,令牌是您识别他/她的方式,因此如果允许,他们可以做任何想做的事。如果用户对数据的访问权限有限,您可以在后端检查他们是否可以访问。
  • 您不会为用户可能请求访问的每个范围生成不同的令牌。令牌本身已经编码了用户标识符以及他/她拥有的权限(范围)。 Passport 所做的是检查您指定的请求范围 ('scope' => 'access-image',) 是否包含在用户编码的令牌中。
  • 在我的团队中,Laravel Passport 仅在内部与 WebApp 和移动应用程序一起使用,但实际上grant_type: password 生成的令牌是完全开放的。
  • 所以我认为访问其他资源的多个令牌:{"picture_token": "", "message_token": ""} 等等,message_token 的范围为'scope' => 'access-message'
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 2019-01-18
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 2019-08-30
  • 2017-09-24
  • 1970-01-01
相关资源
最近更新 更多