Laravel Passport TokenGuard::__construct() 必须实现接口
Laravel Passport TokenGuard::__construct() must implement interface
我正在使用 Laravel 和 Laravel 护照创建休息 api。我尝试访问受默认 laravel api auth 中间件保护的路由:
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Route::prefix('auth')->group(function () {
Route::post('login', 'Auth\ApiAuthController@login');
});
在请求 header 中我传递了 Authorization: Bearer <my_secret_token>
但我得到了这个异常:
Argument 1 passed to Illuminate\Auth\TokenGuard::__construct() must implement interface Illuminate\Contracts\Auth\UserProvider, null given, called in /Users/markusheinemann/Projekte/Lycus/application/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 162
这是我的要求header:
{
content-type: "application/json",
x-requested-with: "XMLHttpRequest",
authorization: "********",
user-agent: "PostmanRuntime/7.13.0",
accept: "*/*",
cache-control: "no-cache",
postman-token: "ebfa3211-958d-4042-ab6a-a488847fc2f7",
host: "localhost",
accept-encoding: "gzip, deflate",
connection: "keep-alive"
}
这里是我的令牌创建过程:
public function login(LoginRequest $request)
{
$credentials = $request->only(['email', 'password']);
if(!Auth::attempt($credentials)) {
return response()->json(['message' => trans('auth.failed')], 401);
}
$token = $request->user()->createToken('Lycus Frontend Client');
$token->token->save();
return response()->json([
'accessToken' => $token->accessToken,
'expiresAt' => $token->token->expires_at,
]);
}
有人知道为什么我会收到此错误吗?
确保您的用户模型使用:
class User extends Authenticatable
{
use HasApiTokens;
}
---编辑----
我在网上的一些指南中看到了登录代码,我个人认为最好将请求重新发送到 Passport API 并让它登录并创建令牌。
$request->validate([
'email' => 'required|string|email',
'password' => 'required|string'
]);
$http = new Client();
try {
$response = $http->post('/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 2,
'client_secret' => 'secret_key_from_passport_client',
'username' => $request->email,
'password' => $request->password,
]
]);
return $response->getBody();
} catch (BadResponseException $e) {
return response()->json([], 422);
}
---编辑---
如果将用户移动到其他命名空间,请不要忘记更改 auth.php
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\Auth\User::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
我正在使用 Laravel 和 Laravel 护照创建休息 api。我尝试访问受默认 laravel api auth 中间件保护的路由:
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Route::prefix('auth')->group(function () {
Route::post('login', 'Auth\ApiAuthController@login');
});
在请求 header 中我传递了 Authorization: Bearer <my_secret_token>
但我得到了这个异常:
Argument 1 passed to Illuminate\Auth\TokenGuard::__construct() must implement interface Illuminate\Contracts\Auth\UserProvider, null given, called in /Users/markusheinemann/Projekte/Lycus/application/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 162
这是我的要求header:
{
content-type: "application/json",
x-requested-with: "XMLHttpRequest",
authorization: "********",
user-agent: "PostmanRuntime/7.13.0",
accept: "*/*",
cache-control: "no-cache",
postman-token: "ebfa3211-958d-4042-ab6a-a488847fc2f7",
host: "localhost",
accept-encoding: "gzip, deflate",
connection: "keep-alive"
}
这里是我的令牌创建过程:
public function login(LoginRequest $request)
{
$credentials = $request->only(['email', 'password']);
if(!Auth::attempt($credentials)) {
return response()->json(['message' => trans('auth.failed')], 401);
}
$token = $request->user()->createToken('Lycus Frontend Client');
$token->token->save();
return response()->json([
'accessToken' => $token->accessToken,
'expiresAt' => $token->token->expires_at,
]);
}
有人知道为什么我会收到此错误吗?
确保您的用户模型使用:
class User extends Authenticatable
{
use HasApiTokens;
}
---编辑----
我在网上的一些指南中看到了登录代码,我个人认为最好将请求重新发送到 Passport API 并让它登录并创建令牌。
$request->validate([
'email' => 'required|string|email',
'password' => 'required|string'
]);
$http = new Client();
try {
$response = $http->post('/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 2,
'client_secret' => 'secret_key_from_passport_client',
'username' => $request->email,
'password' => $request->password,
]
]);
return $response->getBody();
} catch (BadResponseException $e) {
return response()->json([], 422);
}
---编辑--- 如果将用户移动到其他命名空间,请不要忘记更改 auth.php
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\Auth\User::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],