Laravel - API 版本控制 /v2/ 端点总是 return 401
Laravel - API Versioning /v2/ endpoints always return 401
我目前正在开发 Laravel API,它使用 Laravel Passport (OAuth2)。我最近向我的 Laravel 应用程序 API 添加了一个 v2。在我的本地机器上一切正常。但是在我的测试服务器上,当我向 v2 端点发送请求时,应用程序总是抛出 401。
这是我的设置:
路由服务提供商:
protected function mapApiRoutes()
{
Route::group([
'middleware' => ['api', 'api_version:v1'],
'namespace' => "{$this->namespace}",
'prefix' => 'api',
], function ($router) {
require base_path('routes/api.php');
});
Route::group([
'middleware' => ['api', 'api_version:v2'],
'namespace' => "{$this->namespace}\V2",
'prefix' => 'api/v2',
], function ($router) {
require base_path('routes/api/api_v2.php');
});
}
auth.php:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
'api_v2' => [
'driver' => 'passport',
'provider' => 'users_v2',
],
],
// ...
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\Base\User::class,
],
'users_v2' => [
'driver' => 'eloquent',
'model' => App\Models\V2\Base\User::class,
],
],
routes/api_v2.php:
Route::group(['middleware' => ['auth:api_v2']], function() {
Route::get('user', 'Base\UserController@authUserV2');
// ...
});
API版本中间件:
public function handle(Request $request, Closure $next, $guard)
{
if ($guard != 'v1') {
// Morph user model
$apiVersion = $guard == '' ? '' : ('\' . strtoupper($guard) . '\');
Relation::morphMap([
'App\User' => 'App\Models\Base\User',
'App\Models\Base\User' => 'App\Models' . $apiVersion . 'Base\User'
]);
config(['app.api.version' => $guard]);
return $next($request);
}
请求在执行 API版本中间件之前抛出 401。
我不知道为什么它在我的本地机器上运行,但在我的测试服务器上却不行。此错误代码或机器相关吗?
编辑
我发现,一旦我将 api_v2 的守卫改回 users
而不是 users_v2
它就会起作用。但是它不使用 V2 用户模型,这当然会在我的控制器中引发错误。
经过 小时 的搜索,我发现了我的问题。
我本地计算机的数据库有一个较旧的 oauth_clients
table,它不包含 provider
列。将我的测试服务器上的 provider
列更改为 NULL
后,一切正常!
有人知道是否可以在此列中指定多个提供商而不是全部允许吗?
我目前正在开发 Laravel API,它使用 Laravel Passport (OAuth2)。我最近向我的 Laravel 应用程序 API 添加了一个 v2。在我的本地机器上一切正常。但是在我的测试服务器上,当我向 v2 端点发送请求时,应用程序总是抛出 401。
这是我的设置:
路由服务提供商:
protected function mapApiRoutes()
{
Route::group([
'middleware' => ['api', 'api_version:v1'],
'namespace' => "{$this->namespace}",
'prefix' => 'api',
], function ($router) {
require base_path('routes/api.php');
});
Route::group([
'middleware' => ['api', 'api_version:v2'],
'namespace' => "{$this->namespace}\V2",
'prefix' => 'api/v2',
], function ($router) {
require base_path('routes/api/api_v2.php');
});
}
auth.php:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
'api_v2' => [
'driver' => 'passport',
'provider' => 'users_v2',
],
],
// ...
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\Base\User::class,
],
'users_v2' => [
'driver' => 'eloquent',
'model' => App\Models\V2\Base\User::class,
],
],
routes/api_v2.php:
Route::group(['middleware' => ['auth:api_v2']], function() {
Route::get('user', 'Base\UserController@authUserV2');
// ...
});
API版本中间件:
public function handle(Request $request, Closure $next, $guard)
{
if ($guard != 'v1') {
// Morph user model
$apiVersion = $guard == '' ? '' : ('\' . strtoupper($guard) . '\');
Relation::morphMap([
'App\User' => 'App\Models\Base\User',
'App\Models\Base\User' => 'App\Models' . $apiVersion . 'Base\User'
]);
config(['app.api.version' => $guard]);
return $next($request);
}
请求在执行 API版本中间件之前抛出 401。
我不知道为什么它在我的本地机器上运行,但在我的测试服务器上却不行。此错误代码或机器相关吗?
编辑
我发现,一旦我将 api_v2 的守卫改回 users
而不是 users_v2
它就会起作用。但是它不使用 V2 用户模型,这当然会在我的控制器中引发错误。
经过 小时 的搜索,我发现了我的问题。
我本地计算机的数据库有一个较旧的 oauth_clients
table,它不包含 provider
列。将我的测试服务器上的 provider
列更改为 NULL
后,一切正常!
有人知道是否可以在此列中指定多个提供商而不是全部允许吗?