[英]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.