有个需求,得在代码里获取 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')
搞定,而且这样也不会有被伪造的风险。
