有个需求,得在代码里获取 ClientID,但对于 API 请求的时候是只有 AccessToken 的,所以还得处理下。
上网搜了下,发现并没有太合适的方案,就自己团了一个。
创建一个 Middleware,然后调用即可。
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Auth\AuthenticationException; use League\OAuth2\Server\Exception\OAuthServerException; use Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory; class AddAccessTokenHeader extends \Laravel\Passport\Http\Middleware\CheckClientCredentials { public function handle($request, Closure $next, ...$scopes) { $psr = (new DiactorosFactory)->createRequest($request); try { $psr = $this->server->validateAuthenticatedRequest($psr); } catch (OAuthServerException $e) { throw new AuthenticationException; } $this->validateScopes($psr, $scopes); $request["oauth_client_id"] = $psr->getAttribute('oauth_client_id'); return $next($request); } }
然后,这样来获取 ClientID:
$request->input('oauth_client_id')
搞定,而且这样也不会有被伪造的风险。