繁体   English   中英

Laravel Passport Auth::user()->token 返回 null 而 Auth::user 不是 null

[英]Laravel Passport Auth::user()->token return null while Auth::user is not null

我正在尝试 output Laravel 中当前用户的访问令牌。这是我当前的 controller Class PassportController.php

class PassportController extends Controller
{
    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->user = Auth::user();
            if (Auth::user() == null) return response(['message' => 'Unauthenticated']);
            return $next($request);
        });
    } 
    public function getToken()
    {
        $token = Auth::user()->token;
        return response($token);
    }
}

model 用户.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; // use Illuminate\Database\Eloquent\Casts\Attribute; use Laravel\Passport\HasApiTokens; use Illuminate\Notifications\Notifiable;


    class User extends Authenticatable
    {
        use HasFactory, HasApiTokens, Notifiable;
    
        
        protected $fillable = ['username', 'password'];
        public function messages()
        {
            return $this->hasMany(Message::class);
        }
    
        public function rooms()
        {
            return $this->belongsToMany(Room::class, 'room_user', 'user_id', 'room_id');
        }
    
        protected $hidden = ['created_at', 'password', 'updated_at', 'rmb_token'];
    }

路线

  Route::get('/tokens', 'API\PassportController@getToken');

我还确保在我的 Postman 请求中包含授权 header,内容为 Bearer {access_token}。 当我尝试 Auth::user()->token 时,Auth::user 返回的用户与预期的一样,但它给了我

App\Models\User::token 必须返回一个关系实例

错误,当我dd(Auth::user()->token)我得到它作为 null。我还记得输入

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

在 config/auth.php 中,所以我不确定是什么原因造成的。 我正在运行最新版本的 Laravel (laravel 9.45.0)。

Auth::user() - 这是一个数据 object,其中包含有关授权用户的信息,有关该用户的数据又存储在用户表中的数据库中。

此表中的令牌未存储且未存储,如果您使用护照。 然后您的令牌存储在 oauth_access_tokens 表中。

因此,您为什么决定在 Auth::user() object 中包含授权令牌? 当然,除非你通过某种拐杖以某种方式将它写在那里,修改 object。但这是根本错误的!

您的授权 controller 应如下所示:

<?php

namespace App\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
use Carbon\Carbon;
use App\Requests\LoginRequest;

/**
 * Class LoginController
 * @package App\Controllers\Auth
 */
class LoginController extends Controller
{
    /**
     * @param LoginRequest $request
     * @return JsonResponse
     */
    public function login (LoginRequest $request): JsonResponse
    {
        $credentials = $request->only('email', 'password');

        if (\Auth::attempt($credentials) === false) {
            return response()->json([
                'status' => false,
                'errors' => ['message' => __('auth.login_error')],
                'data'   => []
            ], 403);
        }

        $user = $request->user();
        $tokenResult = $user->createToken('YOUR Personal Access Token');

        return response()->json([
            'status' => true,
            'errors' => [],
            'data' => [
                'token_type' => 'Bearer',
                'token'      => $tokenResult->accessToken,
                'expires_at' => Carbon::parse($tokenResult->token->expires_at)->toDateTimeString(),
                'user'       => $user
            ]
        ]);
    }
}

请求 class 看起来像这样:

<?php

namespace App\Requests;

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Validation\ValidationException;

/**
 * Class LoginRequest
 * @package App\Requests
 */
class LoginRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return string[]
     */
    public function rules(): array
    {
        return [
            'email' => 'required|string|email|max:100',
            'password' => 'required|string|min:6|max:20',
        ];
    }

    /**
     * @param Validator $validator
     */
    protected function failedValidation(Validator $validator)
    {
        // remove the redirect for authorization by api
        $errors = (new ValidationException($validator))->errors();
        throw new HttpResponseException(
            response()->json([
                'status' => false,
                'errors' => $errors,
                'data'   => []
            ], JsonResponse::HTTP_UNPROCESSABLE_ENTITY)
        );
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM