【问题标题】:Using Sanctum with Laravel Spark conflict使用 Sanctum 与 Laravel Spark 冲突
【发布时间】:2021-01-21 23:01:48
【问题描述】:

我的设置

  • Laravel 8
  • Laravel 火花莫莉

在使用 Spark 和 Sanctum 调用 API 请求时,我经常碰壁。我已经顺利安装了 Sanctum 并进行了迁移。

我已将use Laravel\Sanctum\HasApiTokens; 添加到app/Models/User.php 并将use HasApiTokens; 添加到班级。

我的 Api.php 路由

Route::group([
    'middleware' => 'auth:sanctum'
], function () {
    Route::get('categories', [\App\Http\Controllers\categories::class, 'fetchCategories']);
});

当我调用 Api 时出现此错误

ErrorException
Declaration of Laravel\Sanctum\HasApiTokens::tokenCan(string $ability) should be compatible with Laravel\Spark\User::tokenCan($ability)

我尝试在 User.php 上将 use Laravel\Sanctum\HasApiTokens; 更改为 Laravel\Spark\HasApiTokens。错误消失了,但每当我尝试调用 Api 时,它都会让我返回登录主页。

有什么想法吗?由于 Spark 文档并未真正解释 Sanctum 或 Api 保护的工作原理。

【问题讨论】:

    标签: laravel laravel-authentication laravel-spark laravel-sanctum laravel-api


    【解决方案1】:

    问题在于您的主用户类从供应商 Spark 库中扩展了用户类。此 User 模型使用名为 HasApiTokens 的 trait,它与 Sanctum 不同

    由于您不想更改供应商目录中的文件,因此我发现的一个解决方法是从供应商处复制原始 SparkUser 模型类并创建一个像这样的新模型类并删除特征 HasApiTokens,因为您不不想再用了。

    <?php
    
    namespace App\Models\Users;
    
    use Illuminate\Support\Str;
    use Laravel\Spark\Billable;
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class SparkUser extends Authenticatable
    {
        use Billable, Notifiable; // HasApiTokens was removed from the original SparkUser class
    
    /**
     * Get the profile photo URL attribute.
     *
     * @param  string|null  $value
     * @return string|null
     */
    public function getPhotoUrlAttribute($value)
    {
        return empty($value) ? 'https://www.gravatar.com/avatar/'.md5(Str::lower($this->email)).'.jpg?s=200&d=mm' : url($value);
    }
    
    /**
     * Make the team user visible for the current user.
     *
     * @return $this
     */
    public function shouldHaveSelfVisibility()
    {
        return $this->makeVisible([
            'uses_two_factor_auth',
            'country_code',
            'phone',
            'card_brand',
            'card_last_four',
            'card_country',
            'billing_address',
            'billing_address_line_2',
            'billing_city',
            'billing_state',
            'billing_zip',
            'billing_country',
            'extra_billing_information'
        ]);
    }
    
    /**
     * Convert the model instance to an array.
     *
     * @return array
     */
    public function toArray()
    {
        $array = parent::toArray();
    
        if (! in_array('tax_rate', $this->hidden)) {
            $array['tax_rate'] = $this->taxPercentage();
        }
    
        return $array;
    }
    

    }

    现在我只需要改变我原来的 User 类模型来使用这个像这样的新模型并添加来自 Sanctum 的特征 HasApiTokens!

    use App\Models\SparkUser; // Modified from the original in the vendor folder
    use Laravel\Sanctum\HasApiTokens;
    
    class User extends SparkUser
    {
        use HasApiTokens;
        
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 2020-11-06
      • 1970-01-01
      • 2019-06-21
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2018-10-01
      相关资源
      最近更新 更多