标签: laravel-sanctum

测试 Laravel Sanctum 会导致错误的方法调用

我正在尝试测试经过身份验证的 API 路由,只有经过身份验证的用户才能将其发布到特定路由。

查看 Laravel Sanctum 文档,我可以使用下面的代码来创建和验证用户:

Sanctum::actingAs(
    factory(User::class)->create(),
    ['*']
);
Run Code Online (Sandbox Code Playgroud)

当我尝试复制此内容时,运行测试时出错

BadMethodCallException: Call to undefined method App\User::withAccessToken()
Run Code Online (Sandbox Code Playgroud)

我的测试代码如下:

    public function an_authenticated_user_can_add_a_client()
    {
        $user = Sanctum::actingAs(
            factory(User::class)->create(),
            ['*']
        );
        dd($user);
        // $this->post('/api/clients', $this->data());
    }
Run Code Online (Sandbox Code Playgroud)

api.php

Route::middleware('auth:sanctum')->group(function () {

    //Clients
    Route::get('/clients/{client}','ContactsController@show');
    Route::post('/clients','ContactsController@store');
    Route::patch('/clients/{client}','ContactsController@update');
    Route::delete('/clients/{client}','ContactsController@destroy');
});
Run Code Online (Sandbox Code Playgroud)

我的 User 类中没有 withAccessToken() 方法,并且看不到该方法来自何处或在任何地方指定。任何帮助将不胜感激。

laravel laravel-sanctum

5
推荐指数
2
解决办法
7109
查看次数

Laravel Sanctum 代币 - 两个数据库

我在让 Laravel Sanctum 授权两个独立数据库中的两个表时遇到一些问题。

我正在使用 Laravel Sanctum 令牌进行授权。我有两个表来授权用户(用户和联系人),我设置了两个单独的防护,并且可以使用一个令牌表在单个数据库上完成所有操作。

但是我想将联系人表放在一个单独的数据库中。这样做会创建两个personal_access_tokens表,一个在用户数据库中,另一个在联系人数据库中,我不介意。我可以很好地创建令牌,但是当我尝试使用令牌授权联系人时,Sanctum 会尝试查看“用户”personal_access_tokens 表,而不是“联系人”personal_access_tokens 表。所以本质上它只是在查看personal_access_tokens 表的错误数据库,我不知道如何更改它。

我的设置如下:

守卫:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    /*'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],*/

    'users' => [
        'driver' => 'sanctum',
        'provider' => 'users',
        'hash' => false,
    ],

    'contacts' => [
        'driver' => 'sanctum',
        'provider' => 'contacts',
        'hash' => false,
    ],
],
Run Code Online (Sandbox Code Playgroud)

供应商

   'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => …
Run Code Online (Sandbox Code Playgroud)

php laravel laravel-sanctum

5
推荐指数
1
解决办法
3118
查看次数

我如何使用 Laravel Sanctum 处理 SPA 和基于令牌的身份验证

我花了几天时间在 Laravel Sanctum 上尝试弄清楚如何设置我的身份验证系统。

语境

我正在为我的公司构建一个门票 Web 应用程序,为此我决定构建一个 API 和一个使用该 API 的 React 前端应用程序。该应用程序的最终用户需要一个帐户来管理票证,因此我在数据库中创建一个用户表,并为 API 创建多个路由来创建、删除和更新用户。为了管理用户 api 身份验证,我决定使用 Laravel Sanctum 及其基于会话的内置 SPA 身份验证系统。

为此,我遵循指南并设置所有需求,以确保前端准备好与 Laravel Santum 一起使用。这是我的 api 中间件的 Kernel.php :

'api' => [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
],
Run Code Online (Sandbox Code Playgroud)

web.php 中的路由通过 Laravel Sanctum SPA 身份验证登录/注销用户。

<?php
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;

Route::post('/login', [UserController::class, 'login']);
Route::get('/logout', [UserController::class, 'logout']);
Run Code Online (Sandbox Code Playgroud)

问题

我必须构建一个非 Web 应用程序,特别是一个 Windows 服务,它需要在数据库中获取数据,并使用/api/ticketsAPI 的端点和POST方法来使用这些数据创建新票证。

我知道这个未来的 Windows 服务不是前端应用程序,所以我无法使用 SPA 身份验证系统。相反,我想使用 Laravel Sanctum 的令牌来验证服务。

我的问题是:

  • 我如何实现这一点并将users身份验证和service身份验证分开。 …

authentication laravel laravel-sanctum

5
推荐指数
1
解决办法
3376
查看次数

laravel sainttum 路线 [登录] 未定义

我试图在我的 laravel vue 应用程序中获取当前用户。每当我尝试获取它时,我都会收到此错误:

Symfony\Component\Routing\Exception\RouteNotFoundException: Route [login] not defined. in file C:\Users\Moeme\Documents\School\HsLeiden\Keuzevakken\IKFRAM\sla ticketsystem\ticketsystem\vendor\laravel\framework\src\Illuminate\Routing\UrlGenerator.php on line 444

这是我在邮递员中发送的内容:

这是我在邮递员中发送的内容

这就是我的routes\api.php

Route::middleware('auth:sanctum')->get('/user', function (Request $request) { 
    return $request->user();
});
Run Code Online (Sandbox Code Playgroud)

我真的不知道为什么它不起作用

谢谢您的帮助

php laravel laravel-sanctum

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

为什么我的 CSRF 令牌与 Laravel 和 Sanctum 不匹配?

我有一个 Laravel 后端和 React 前端,我使用 sainttum 进行 SPA 身份验证,并使用 Axios 来发出请求。我使用 localhost ,后端位于 http://localhost:8000 ,前端位于 http://localhost:3000 。

这是我的前端代码:

const apiClient = axios.create({
    baseURL: `http://localhost:8000`,
    withCredentials: true,
});    

let config = {
    headers: {
        'Content-Type': 'application/json'
    },
}

export async function login(credentials: LoginCredentials) {

    return apiClient.get('sanctum/csrf-cookie', config).then(response => {
        apiClient.post('/api/v1/login', JSON.stringify(credentials));
    });
}
Run Code Online (Sandbox Code Playgroud)

我的 api 中间件类看起来像这样

'api' => [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            'throttle:api',
        ],
Run Code Online (Sandbox Code Playgroud)

这些是我的圣所配置;

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
        '%s%s',
        'localhost,localhost:3000,localhost:3000/api/v1/login,127.0.0.1,127.0.0.1:8000,::1',
        env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
    ))), …
Run Code Online (Sandbox Code Playgroud)

laravel reactjs laravel-sanctum

5
推荐指数
2
解决办法
4753
查看次数

Laravel sainttum csrf cookie set 问题“尝试通过 Set-Cookie 标头设置 cookie 被阻止,因为它的 Domain 属性......”

我对 Laravel Sanctum CSRF Coo​​kie 有疑问。我在子域上使用 Laravel 8 运行 API: api.domain.nl 并在 domain.nl 上使用 NuxtJS 运行前端 现在我想使用设置的 CSRF cookie 保护将发送到 api.domain.nl 的 POST 请求在前端。为了实现这一目标,我阅读了有关 Laravel Sanctum 的文章。现在我向 api.domain.nl/api/sanctum/csrf-cookie 发送 POST 请求,这会返回 204 状态并尝试执行 SET-COOKIE 标头。在本地主机上,这工作正常。但每当我尝试在我的服务器上执行此操作时,我都会收到此错误:

This attempt to set a cookie via a Set-Cookie header was blocked because its Domain attribute was invalid with regards to the current host URL
Run Code Online (Sandbox Code Playgroud)

通过 Set-Cookie 标头设置 cookie 的尝试被阻止,因为其 Domain 属性对于当前主机 URL 无效

现在我确实读到了其他一些人也遇到了这个问题。它与你的 Laravel .env 有关,我尝试了SESSION_DOMAINSANCTUM_STATEFUL_DOMAINS的所有内容,但老实说,我很无能,因为它一直给我同样的错误。现在,我有这个:

SESSION_DOMAIN=.domain.nl
SANCTUM_STATEFUL_DOMAIN=api.domain.nl
Run Code Online (Sandbox Code Playgroud)

(当然域名替换成我使用的域名)

希望有人能解决这个问题!

laravel nuxt.js laravel-sanctum laravel-8

5
推荐指数
1
解决办法
1344
查看次数

新的 Laravel Sanctum API 重定向到“/dashboard”路线

我全新安装了 Laravel Sanctum API。当我尝试在注册后登录用户或提交注册表两次时,出现异常并显示消息“找不到路线仪表板”。我不明白为什么它试图将用户重定向到“仪表板”路线。我在项目中唯一可以看到“仪表板”的地方是 RouteServiceProvider。这对我来说似乎也是 Sanctum 的一个错误。

在此输入图像描述

laravel laravel-sanctum

5
推荐指数
2
解决办法
2926
查看次数

在服务器端使用 laravel sainttum session-bases 和 next.js (如 getServerSideProps 方法)

我的网站有 laravel 作为后端,next.js 作为前端。我使用 laravel sainttum 进行身份验证。

我的 laravel 应用程序和 next.js 应用程序位于同一主机中,然后我可以使用基于会话的密室进行身份验证,而无需使用令牌。

登录后,当我想访问 next.js 客户端中受中间件 aute:sanctum 保护的路由时,没有问题,但在服务器端总是出现未经验证的错误。

这是我的 axios 配置和在 next.js 中获取数据的函数:

// axios instance
const axiosInstance = axios.create({
  baseURL: 'localhost:8000',
  withCredentials: true,
  headers: {
    'X-Requested-With': 'XMLHttpRequest',
  },
});

const onRequest = (config) => {
  if ((
    config.method == 'post' ||
    config.method == 'put' ||
    config.method == 'delete'
    /* other methods you want to add here */
  ) &&
    !Cookies.get('XSRF-TOKEN')) {
    return setCSRFToken()
      .then(response => config);
  }
  return config;
} …
Run Code Online (Sandbox Code Playgroud)

session laravel axios laravel-sanctum

5
推荐指数
0
解决办法
1092
查看次数

有没有办法在不同的域上拥有圣所

我在域 A 上有 spa,在域 BI 上有一个 Laravel 服务器,想使用 sainttum,但 cookie 只在同一个域中工作,所以你建议有什么办法解决这个问题吗?我不想在 sainttum 上使用基于令牌的 AUTH

cookies laravel single-page-application laravel-sanctum

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

尝试将 Laravel Sanctum 与自定义模型一起使用时出现错误 502

我正在使用 Laravel sainttum 来验证我的 API,但我没有使用默认的 laravel User 模型,我构建了一个模型来在另一个名为 Customer 的表中分隔我的应用程序客户。为此,我做了以下修改

定制型号Customer.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class Customer extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    protected $fillable = [
        'first_name',
        'last_name',
        'email',
        'password',
        'cpf',
        'phone',
        'postcode',
        'address',
        'number',
        'neighborhood',
        'city',
        'state',
        'country',
        'store_front_id'
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * …
Run Code Online (Sandbox Code Playgroud)

php nginx laravel laravel-sanctum

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