【问题标题】:Laravel Passport get user Access Token after being issuedLaravel Passport 颁发后获取用户访问令牌
【发布时间】:2021-06-12 03:53:23
【问题描述】:

我正在使用 Laravel Passport 在用户登录后向用户发出 Bearers,然后能够连接到 API(是的,我知道 Sanctum 可能更适合我的需求,但我使用的是 Passport,所以甚至不要提及切换到 Sanctum),然后在前端,我将用户电子邮件和 Bearer 存储在 cookie 中,以便稍后将它们用于其他查询并将承载添加到 Axios Auth 标头,尽管现在我的逻辑有问题,可能与我不知道如何在 Nuxt 中正确使用 Passport 有关。

对于我在发布请求中向用户发送电子邮件的每个页面都有查询,它们会返回全局信息和用户信息的组合。

是的,我的端点已经在一个身份验证中间件后面,但我只是发送了一个承载令牌以允许使用任何数据查询端点,没有阻止向用户 A 询问用户 B 信息。

如何使用阻止用户发送不同的电子邮件并获取其他用户的信息?

这就是我颁发访问令牌的方式:

$token    = $user->createToken('Laravel Password Grant Client')->accessToken;

有办法做这样的事情吗?

$user = User::where('email', $request->email)->first();
// E.g. user@mail.com  ...

// Get the user Access Token
$userToken    = $user->getAccessToken;
// E.g. someBerareText

// check if the User Access Token match with the one send in the request
// if they don't match throw a 401
if ($userToken !== $request->header('Authorization')) {
   return response()->json([ "error" => "Not Authorized" ], 401);
...

// E.g. $request->header('Authorization') it's SomeOtherBearer because he
// requested info for user@mail.com but the $request->header('Authorization')
// belong to otheruser@othermail.com

用户仍然可以发送相同的请求,但使用用户 B 的电子邮件并查看不属于他的其他信息,那么如何检查 $request 中的电子邮件是否属于实际登录的用户?

某种方式来解码访问令牌并检查它是否真的属于用户?

【问题讨论】:

  • 但是您从 auth::user 获取的用户将始终属于令牌,这个用例是什么?或尝试进一步描述问题,为什么需要这样做?
  • 正如我之前提到的,前端的每个页面都向用户发送电子邮件以获取混合或用户信息和页面相关的信息,但这意味着如果用户 A 发送对同一页面的请求但对于用户 B 的电子邮件,它将有用户 B 的信息,这就是问题所在。我的中间件检查请求是否包含授权承载,但这并不妨碍向其他用户询问信息。思路是获取用户的 Bearer,获取用户的信息并检查是否与请求中发送的邮件匹配
  • 但随后 User::where('email', $request->email)->first()->is(Auth::user()) 不起作用检查您针对用户的请求电子邮件认证? Auth::user 正如你所描述的那样加载得非常好,它发生在警卫中,所以当你需要它时不容易调用。
  • 我只是在代码中添加了一个示例以使其更清晰
  • 也是 FE 它与 BE 完全分离,Laravel 仅充当 API,而 FE 它在 Nuxt 中的不同容器中

标签: php laravel laravel-passport


【解决方案1】:

如果Laravel Passport被设置为守卫,它将从承载令牌中获取用户,逻辑可以在Passport中的TokenGuard.php类中看到。它实际上与您想要实现的效果相同。

因此,与使用的防护相比,身份验证的工作方式不同。因此护照要求您更换警卫。这是Laravel 如何区分身份验证以及Auth::user() 如何加载的决定因素。

'guards' => [
    ...

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

这意味着您可以通过比较模型是否相同的模型函数is()来检查用户是否经过正确的身份验证。

User::where('email', $request->email)->first()->is(Auth::user())

【讨论】:

  • 似乎不起作用,我通过邮递员登录 -> 我复制 Bearer 并使用正确的电子邮件在新请求中发送它,我没有任何回复我使用的电子邮件。我的guards 没问题我只是注意到我有一个额外的字段'hash' => false, 只是为了确保我加载的是正确的,是这个吗? use Illuminate\Support\Facades\Auth;
  • dd(Auth::user()) 返回什么?
  • 它不返回任何东西
  • doesnt return anything是编程中的复杂语句,它返回null?
  • 来自 Postman,我可以看到任何内容,一个空的 200 响应我认为它可以为 null,即使它没有说 null
猜你喜欢
  • 1970-01-01
  • 2020-07-12
  • 2019-03-25
  • 2019-06-09
  • 2016-05-20
  • 2016-08-27
  • 2018-06-02
  • 2017-05-23
  • 2017-05-31
相关资源
最近更新 更多