sanctum SPA认证,登录逻辑怎么写?

我想在公众号用户授权登录获取到用户信息后,设置sanctum的登录态,
下面这样写是正确的吗?

  1. 公众号用户模型
<?php

namespace Modules\Wechat\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;

class OfficialAccountUser extends Authenticatable
{
   protected $casts = [
        'origin'  => 'object',
    ];
}
  1. 登录逻辑
use Modules\Wechat\Models\OfficialAccountUser;

class OfficialAccountController extends Controller
{
    /**
     * 公众号网页授权,通过code获取用户信息
     */
    public function login(Request $request)
    {
        //前面的步骤省略,这里是公众号接口获取到的用户数据
        $userInfo = ['openid'=>'12345','nickname'='hahaha'];
        $officialAccountUser = OfficialAccountUser::create($userInfo);
        Auth::guard('sanctum')->login($officialAccountUser);
    }
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

Auth::guard('sanctum') 得到的是 Illuminate\Auth\RequestGuard,其中并没有 login() 方法,实际上如果想要使用 sanctum 来为 spa 提供身份,那么我们还是应该用 web guard,参考文档

接下来,我们可以使用Auth::guard('web') 或者 Auth::guard()都可以得到 web guard(如果不传参数,laravel 会默认去 config/auth.php 找到默认值 'guard' => 'web'),返回的是一个 Illuminate\Auth\SessionGuard,然后调用 login 方法即可登录,该方法会要求你传入一个实现了 Authenticatable 接口的实例(laravel 默认会把 user 实现该接口)。

file

那么,针对你的问题,伪代码可以这样写。

$officialAccountUser = OfficialAccountUser::create($userInfo);
$user = $officialAccountUser->user; // 假设你定了关联关系
Auth::guard()->login($user);
2年前 评论
williamQian (楼主) 2年前
讨论数量: 6

Auth::guard('sanctum') 得到的是 Illuminate\Auth\RequestGuard,其中并没有 login() 方法,实际上如果想要使用 sanctum 来为 spa 提供身份,那么我们还是应该用 web guard,参考文档

接下来,我们可以使用Auth::guard('web') 或者 Auth::guard()都可以得到 web guard(如果不传参数,laravel 会默认去 config/auth.php 找到默认值 'guard' => 'web'),返回的是一个 Illuminate\Auth\SessionGuard,然后调用 login 方法即可登录,该方法会要求你传入一个实现了 Authenticatable 接口的实例(laravel 默认会把 user 实现该接口)。

file

那么,针对你的问题,伪代码可以这样写。

$officialAccountUser = OfficialAccountUser::create($userInfo);
$user = $officialAccountUser->user; // 假设你定了关联关系
Auth::guard()->login($user);
2年前 评论
williamQian (楼主) 2年前

如果是api的话

class User extends Authenticatable
{
    use HasApiTokens;
}
$token = $user->createToken('app', ['app'])->plainTextToken;
2年前 评论
williamQian (楼主) 2年前
周小云 1年前
周小云 1年前

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