有个需求,得在代码里获取  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')

搞定,而且这样也不会有被伪造的风险。