Auth:Sanctum怎么实现多账号库接口认证

场景:
A账号和Token都在A库;
B账号和Token都在B库;
AB账号请求的接口是分开的;

自定义PersonalAccessToken是全局的,只能认证A或B,不能同时认证。我想要分接口AB账号都能认证,怎么搞?

Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);

我的解决办法:

重点是切换token的库

指定b账号token数据库

use Laravel\Sanctum\PersonalAccessToken as SanctumPersonalAccessToken;

class PersonalAccessToken extends SanctumPersonalAccessToken
{
    // 指定库
    protected $connection = 'b';
}

AuthServiceProvider加入自定义b账号认证,

Auth::viaRequest('b_auth', function (Request $request) {
            $token = str_replace('Bearer ','',$request->header('authorization'));

            $item = PersonalAccessToken::findToken($token);

            if($item) {
                return $item->tokenable_type::find($item->tokenable_id);
            }
            return null;
        });

auth.php 配置 guards 加入 “b_auth”,providers加入b账号的model

'guards' => [
        ....,
        'aapi' => [
            'driver' => 'sanctum',
            'provider' => 'a_user',
        ],
        'bapi' => [
            'driver' => 'b_auth',// 自定义的看守器
            'provider' => 'b_user',
        ],
    ],
'providers' => [
        'a_users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User\AUser::class,
        ],

        'b_user' => [
            'driver' => 'eloquent',
            'model' => App\Models\Account\BUser::class,
        ],

    ],
本作品采用《CC 协议》,转载必须注明作者和本文链接
Debuff
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 5
猪猪

a库认证失败,在b库下认证一次,这样应该可以,如果两次都失败才是真正的失败

2个月前 评论
Debuff (楼主) 2个月前

你viaRequest时直接

Auth::viaRequest('b_auth', function (Request $request) {
    Sanctum::usePersonalAccessTokenModel(BModelPersonalAccessToken::class);
    return Auth::guard('sanctum')->user();
}

这样行不行 :joy:

2个月前 评论
Debuff (楼主) 2个月前

前端请求带参数区分

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!