标签: laravel-sanctum

Laravel Sanctum auth:sanctum 中间件与 Angular SPA 未经身份验证的响应

我有一个具有以下设置的应用程序:

Laravel

主机:appname.local:8000

环境变量:

  • SESSION_DRIVER=数据库
  • SESSION_LIFETIME=480
  • SESSION_CONNECTION=mysql
  • SESSION_DOMAIN=.appname.local
  • SESSION_SECURE_COOKIE=假
  • SESSION_COOKIE=appnameapi_session
  • SANCTUM_STATEFUL_DOMAINS='.appname.local,localhost,127.0.0.1'

主机:appname.local:4200

目前有效的方法:

  • 我可以调用 Sanctum 的 csrf-cookie 端点,它在我的浏览器中设置 CSRF 令牌。
  • 然后我可以调用我的 API 的登录端点来使用 Auth::attempt() 来验证我的 Laravel 应用程序中的用户。这会在会话表中创建一个新条目,如下所示

获取令牌和验证用户的角度方法 获取令牌和登录的角度方法

认证成功后的会话数据库条目 认证成功后的会话数据库条目

什么不起作用:

对受以下中间件保护的路由的后续请求:auth:sanctum都会导致未经身份验证的响应。HTTP 请求永远不会到达我的控制器。

auth:sanctum 保护路由 auth:sanctum 保护路由

但是我可以在开发人员的控制台中看到正在发送 cookie。所以我不明白为什么 Sanctum 不接受认证 在此处输入图片说明

我已经学习了几个教程,但我似乎无法理解为什么 Laravel 的 Authenticate 中间件无法看到我已经对我的用户进行了身份验证。

有谁知道我可能做错了什么?

php laravel angular laravel-sanctum

4
推荐指数
1
解决办法
9091
查看次数

使用 Laravel Sanctum 获取用户数据

我之前使用过 Laravel 的内置 api 令牌身份验证,但我想为不同的客户端提供多个 api 令牌,并且在 Laravel 7.x 中,我正在尝试迁移到 Laravel Sanctum。

API 似乎可以毫无问题地对用户进行身份验证,但是当我尝试使用 获取用户数据时Auth::user();,它返回空值。也 Auth::guard('api')->user();返回null。

我应该使用什么作为 Auth 守卫?还是根据提供的令牌获取用户数据的正确方法?

非常感谢....

php laravel laravel-passport laravel-sanctum

4
推荐指数
2
解决办法
1万
查看次数

Laravel sanctum 如何使令牌过期?

当我运行$user->currentAccessToken()->delete();令牌过期时,Auth::check()变成false,它是预期的。

但是,当我走到personal_access_tokens桌子旁时,令牌仍在那里。没有软删除字段。Sanctum 现在令牌过期了怎么办?

laravel laravel-sanctum

4
推荐指数
3
解决办法
9871
查看次数

Laravel Sanctum:如何配置令牌的到期日期?

背景和需求

在我的api路由文件中,我按照文档(https://laravel.com/docs/8.x/sanctum#introduction)编写了以下代码:

Route::post('/tokens/create', function (Request $request) {
    $token = $request->user()->createToken($request->token_name);
    return ['token' => $token->plainTextToken];
});
Run Code Online (Sandbox Code Playgroud)

我想设置一个过期延迟,用于将令牌的创建日期与当前检查令牌过期的日期进行比较:令牌的创建日期为x,当前日期为y,并且延迟d会导致令牌过期,如果y > x + d

我做了什么

所以我读了目录中的一些代码vendor/laravel/sanctum,并且找到了该类Guard.php

该类Guard.php包含一个名为 的对象属性$expiration、一个设置该属性的构造函数(以及其他内容)以及__invoke包含以下过期检查的方法:

if (! $accessToken ||
                ($this->expiration &&
                 $accessToken->created_at->lte(now()->subMinutes($this->expiration))) ||
                ! $this->hasValidProvider($accessToken->tokenable)) {
                return;
            }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它正是我想要的。但是,我不知道如何为该属性设置自己的值$expiration

在同一个文件中,有一些对现有配置文件的暗示,如下所示:config('sanctum.guard', 'web'). 此外,该类SanctumServiceProvider实例化Guard以下值并将其传递给其构造函数:config('sanctum.expiration')。但我不知道如何/在哪里定义这个配置值。也许https://laravel.com/docs/8.x/configuration config(['sanctum.expiration' => '1277126']);?请您确认一下吗?(但是这条线该放在哪里呢?) …

laravel laravel-sanctum

4
推荐指数
1
解决办法
2万
查看次数

如何在 Sanctum Laravel 中通过 Token 获取用户

我在 POST 请求正文中将用户的令牌传递给服务器。我需要找出这个令牌属于哪个用户。在 laravel/sanctum 文档中,我发现只有将令牌作为“Authorization”:“Bearer ****”标头才能做到这一点。但这不是我的情况,我需要在 POST 正文中传递它。有办法这样做吗?

laravel laravel-sanctum

4
推荐指数
1
解决办法
1万
查看次数

使用 Laravel 8 和 Sanctum hasapitokens 通过记住我选项登录

因此,我使用 Vue 3、Laravel 8 构建 SPA 并使用 sainttum (hasapitokens) 来处理用户登录,但我找不到令牌有效的会话持续时间,因为我想将其与记住我选项结合使用当用户登录时。这可能吗?或者使用这些令牌是处理用户身份验证的一个坏例子?

laravel vue.js laravel-sanctum

4
推荐指数
1
解决办法
3412
查看次数

通过将令牌作为 GET 查询参数传递来通过 Laravel Sanctum 进行身份验证

我知道将令牌作为 GET 参数传递的危险。我见过这个这个。但是,就我而言,没有其他方法,因为该路由将由我无法影响的脚本调用。

\n

我想我应该实现一个自定义的 Guard 来扩展Illuminate\\Auth\\RequestGuard并重写该public function user()方法。我不明白的是,它$this->callback指向哪里?dd说它是Laravel\\Sanctum\\Guard.. 的一个实例,但是哪个方法呢?

\n
Laravel\\Sanctum\\Guard {#265 \xe2\x96\xbc\n  #auth: Illuminate\\Auth\\AuthManager {#267 \xe2\x96\xb6}\n  #expiration: null\n  #provider: null\n}\n
Run Code Online (Sandbox Code Playgroud)\n

php authentication laravel laravel-sanctum

4
推荐指数
2
解决办法
6635
查看次数

Laravel 9:使用 Fetch API 登录 Sanctum 不起作用

环境

  • 圣所版本:v2.15.1
  • 强化版本:v1.13.0
  • Laravel 版本:v9.17.0
  • PHP版本:PHP 8.1.6
  • 数据库驱动程序和版本:基于 Laravel Sail (docker): image: 'mysql:8.0'

描述:

我正在尝试让我的网络应用程序的登录流程正常工作。该 Web 应用程序是使用 Nuxt 3 作为在 http://localhost:3000 上运行的前端 (SPA) 和 Laravel 作为在 http://localhost 上运行的后端编写的。

因为 Nuxt 3 使用 fetch API,而 axios 目前不适用于 Nuxt 3,所以我试图让 Laravel Sanctum 的登录流程和 fetch API 正常工作。

重现步骤:

我在前端 Nuxt 应用程序上使用可组合函数调用 Laravel 后端,如下所示:

export const useLogin = async (email, password) => {
  const config = useRuntimeConfig()
  const tokenResponse = await $fetch(config.baseURL + '/sanctum/csrf-cookie', {
    method: 'GET',
    credentials: 'include'
  })
  const token = getCookie('XSRF-TOKEN') …
Run Code Online (Sandbox Code Playgroud)

laravel fetch-api laravel-sanctum nuxtjs3

4
推荐指数
1
解决办法
2769
查看次数

Laravel Sanctum - 登录用户最佳实践

我想知道检查用户是否仍然登录客户端的最佳实践是什么。

假设用户登录。如果成功,它将被保存在状态中,如下所示:

axios.post('/login').then(() => {
  this.state.loggedInUser = true
});
Run Code Online (Sandbox Code Playgroud)

现在,如果用户刷新浏览器,状态就会丢失,但 和laravel_session仍然XSRF-TOKEN可用且有效。

在每次页面重新加载时添加中间件以发出检索当前登录用户信息的请求是否有意义?像这样的东西?:

const authMiddleware = () => {
  axios.get('/user').catch(() => console.error('user is not logged in!'));
};
Run Code Online (Sandbox Code Playgroud)

编辑

请注意,我在 SPA 模式下使用 Sanctum。所以没有代币。

laravel vue.js vuex nuxt.js laravel-sanctum

3
推荐指数
1
解决办法
3957
查看次数

Sanctum 和 Postman 的 SPA 身份验证问题

我目前正在尝试使用 Laravel 8.19.0 和 Postman 7.36.1 测试 SPA,但我不断从受“auth:sanctum”保护的路由收到“未经身份验证”的响应,即使我已正确登录。

据我所知,我完全按照https://laravel.com/docs/8.x/sanctum上的文档进行操作 ,以便将 Sanctum 设置为用于 SPA,因此我做了以下操作:

  • 安装了圣域。
  • 发布了圣所配置。
  • 执行了迁移。
  • 包括 EnsureFrontendRequestsAreStateful 中间件和EnsureFrontendRequestsAreStateful::classHttp Kernal 的“ ”。
  • 将我的本地域(相同的顶级域,但 1 个带有“test”子域,另一个带有“api”)添加到 Sanctum 配置文件中的“有状态域”选项中。
  • 将 cors 配置中的“supports_credentials”选项设置为“true”。
  • 设置我的顶级域名,前缀为“.” 对于会话配置中的“域”选项。

然后,我使用https://blog.codecourse.com/laravel-sanctum-airlock-with-postman/上的指南设置了 Postman,因此我编写了一个脚本来从“ /sanctum/csrf” 获取 CSRF 令牌-cookie ”然后使用所述令牌作为请求标头中“X-XSRF-TOKEN”的值,我可以成功登录。但是,当我随后尝试访问由“auth:sanctum”守卫保护的路由时,即使在请求标头中设置了引用者和“X-XSRF-TOKEN”,我也无法访问该路由。

调试后,我可以看到第 63 行的\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php中的方法$this->auth->guard($guard)->check()返回 false ,因为Illuminate\Auth\RequestGuard为 nullauthenticate($request, array $guards)$guard = "sanctum"$this->user()

任何有关要检查的事情的帮助甚至想法都将不胜感激,因为我不确定从这里做什么,缺少花一天时间深入研究请求保护对象及其实例化!

谢谢。

laravel postman laravel-sanctum laravel-8

3
推荐指数
1
解决办法
6019
查看次数