在我的routes/api.php
文件中,我有一个这样的路由组:
Route::group([
'prefix' => config('api.route_prefix'),
'middleware' => ['api', 'auth:api'],
], function() {
// ...
这正确地仅允许具有通过密码授予的令牌的用户授予对这些路由的访问权限。在尝试实施客户端凭据授权时,我发现了separate middleware is necessary。由于auth:api
中间件会引发异常,因此会出现冲突,因为我希望使用任何一种授权类型的有效令牌来访问这些路由。
我发现只使用客户端凭据中间件似乎验证了这两者,但我不确定这样做是否有任何不良影响。
绕过auth:api
中间件并将其替换为Laravel\Passport\Http\Middleware\CheckClientCredentials
是否有任何问题?
答案 0 :(得分:1)
一个明显的重大缺点是客户端凭据似乎在JWT令牌中没有任何用户信息。这会导致请求的用户解析程序为request()->user()
的调用返回null。从Laravel\Passport\Guards\TokenGuard::authenticateViaBearerToken
开始,这将返回null
:
// If the access token is valid we will retrieve the user according to the user ID
// associated with the token. We will use the provider implementation which may
// be used to retrieve users from Eloquent. Next, we'll be ready to continue.
$user = $this->provider->retrieveById(
$psr->getAttribute('oauth_user_id')
);
跟踪$psr->getAttribute
让我看到League\OAuth2\Server\AuthorizationValidators\BearerTokenValidator::validateAuthorization
:
// Return the request with additional attributes
return $request
->withAttribute('oauth_access_token_id', $token->getClaim('jti'))
->withAttribute('oauth_client_id', $token->getClaim('aud'))
->withAttribute('oauth_user_id', $token->getClaim('sub'))
->withAttribute('oauth_scopes', $token->getClaim('scopes'));
除 oauth_user_id
之外的所有属性都是通过令牌上的声明正确设置的,$token
在我的案例中是Lcobucci\JWT\Token
的实例。因此,即使使用具有指定user_id
的oauth客户端,仅使用客户端凭据中间件也不是拥有单组路由的良好解决方案。