Passport 登陆成功,token返回null?

1. 运行环境

win2012

1). 当前使用的 Laravel 版本?

Laravel9
//: <> (使用 php artisan --version 命令查看)

2). 当前使用的 php 版本?

PHP 版本:php 8.2

2. 问题描述?

控制器

<?php

namespace App\Http\Controllers\Api\Auth;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Http;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Admin;

class TokenController extends Controller
{
    const Msg = [
        'success' => 200,
        'error' =>  -1,
        'errorUser' =>  -11,
        'errorPassword'=>-12,
    ];

    private function checkData($request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required|string',
        ]);
        return ['email'=>$request->input('email'),'password'=>$request->input('password'),'passwordHash'=>Hash::make($request->input('password'))];
    }

    public function adminLogin(Request $request)
    {
        $data=$this->checkData($request);
        if($data)
        {
            $userObj=DB::table('admin')->select('id','password','name','avatar','phone')->where('email','=',$data['email'])->first();
            if($userObj)
            {
                if (Hash::check($data['password'], $userObj->password))
                {
                    $token=$this->passwordToken($data['email'], $data['password'],3);
                    $userArr=['email'=>$data['email'],'name'=>$userObj->name,'avatar'=>$userObj->avatar,'phone'=>$userObj->phone];
                    return response()->json(['msg' => '登录成功', 'token'=>$token, 'user'=>$userArr, 'code'=> self::Msg['success']]);
                }
                else
                {
                    return response()->json(['msg' => '密码错误', 'code'=> self::Msg['errorPassword']]);
                }
            }
            return response()->json(['msg' => '账号不存在', 'code'=> self::Msg['errorUser']]);
        }
    }

    public function userLogin(Request $request)
    {
        $data=$this->checkData($request);
        if($data)
        {
            $userObj=DB::table('users')->select('id','password','name','avatar','phone')->where('email','=',$data['email'])->first();
            if($userObj)
            {
                if (Hash::check($data['password'], $userObj->password))
                {
                    $token=$this->passwordToken($data['email'], $data['password'],2);
                    $userArr=['email'=>$data['email'],'name'=>$userObj->name,'avatar'=>$userObj->avatar,'phone'=>$userObj->phone];

                    return response()->json(['msg' => '登录成功', 'token'=>$token, 'user'=>$userArr, 'code'=> self::Msg['success']]);
                }
                else
                {
                    return response()->json(['msg' => '密码错误', 'code'=> self::Msg['errorPassword']]);
                }
            }
            return response()->json(['msg' => '账号不存在', 'code'=> self::Msg['errorUser']]);
        }
    }

    private function passwordToken($email,$password,$client_id)
    {
        $tokenObj=DB::table('oauth_clients')->where('id','=',$client_id)->first();
        $response = Http::asForm()->post('http://api.example.com/oauth/token', [
            'grant_type'=> 'password',
            'client_id'=> $client_id,
            'client_secret'=> $tokenObj->secret,
            'username' => $email,
            'password' => $password,
            'scope' => '*',
        ]);
        return $response->json();
    }

    /**
     * Logout user (Revoke the token)
     *
     * @return [string] message
     */
    public function logout(Request $request)
    {
        $request->user()->token()->revoke();

        return response()->json([
            'message' => 'Successfully logged out'
        ]);
    }

}

模型

<?php

namespace App\Models;

use App\Support\HasRolesUuid;
use App\Support\HasSocialLogin;
use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Hash;
use Laravel\Passport\HasApiTokens;
use Spatie\Permission\Traits\HasRoles;

/**
 * Class User.
 */
class User extends Authenticatable
{
    use Notifiable, UuidScopeTrait, HasFactory, HasApiTokens, HasRoles, SoftDeletes, HasSocialLogin, HasRolesUuid {
        HasRolesUuid::getStoredRole insteadof HasRoles;
    }

    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = [
        'deleted_at',
    ];

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'uuid',
        'email',
        'phone',
        'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    public function socialProviders()
    {
        return $this->hasMany(SocialProvider::class);
    }

    public static function create(array $attributes = [])
    {
        if (array_key_exists('password', $attributes)) {
            $attributes['password'] = Hash::make($attributes['password']);
        }

        $model = static::query()->create($attributes);

        return $model;
    }
}
Postman返回
![](https://cdn.learnku.com/uploads/images/202305/10/106564/WKtcDoZymY.png!large)

验证成功,但是token返回null?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

file

11个月前 评论
joylee109 11个月前
svkp (作者) (楼主) 11个月前
讨论数量: 8

看不出来这和 Passport 有什么关系, token 是 null 你应该看看 passwordToken 方法吧。 看 passwordToken 是请求三方的接口了。

11个月前 评论

passwordToken 请求了Passport的 /oauth/token

11个月前 评论

补充一下,思路是这样的。 因为有两个守卫admin和users,前端携带email和password访问adminLogin方法,可以获得adminToken令牌。前端携带email和password访问userLogin方法,可以获得userToken令牌,passwordToken实际上是向/oauth/token发出请求的

11个月前 评论

oauth_clients 表里面的 provider 字段,是否有对应的值呢?在你的项目中,应该有两个类型: users admin, 从你贴出的代码来看,是没有什么问题的。

11个月前 评论

file

11个月前 评论
joylee109 11个月前
svkp (作者) (楼主) 11个月前

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