いくつかのプロジェクトで使用される小さなSMSゲートウェイを作成しています。
laravelパスポート認証( クライアント資格情報付与トークン )を実装しました
次に、CheckClientCredentials
をAPIミドルウェアグループに追加しました。
protected $middlewareGroups = [
'web' => [
...
],
'api' => [
'throttle:60,1',
'bindings',
\Laravel\Passport\Http\Middleware\CheckClientCredentials::class
],
];
ロジックは正常に機能しているので、コントローラーでクライアントを有効なトークンに関連付ける必要があります。
routes.php
Route::post('/sms', function(Request $request) {
// save the sms along with the client id and send it
$client_id = ''; // get the client id somehow
sendSms($request->text, $request->to, $client_id);
});
明らかなセキュリティ上の理由により、私は消費者のリクエストでクライアントIDを送信することはできません。 $client_id = $request->client_id;
。
これを使用して、認証済みクライアントアプリにアクセスします...
$bearerToken = $request->bearerToken();
$tokenId = (new \Lcobucci\JWT\Parser())->parse($bearerToken)->getHeader('jti');
$client = \Laravel\Passport\Token::find($tokenId)->client;
$client_id = $client->id;
$client_secret = $client->secret;
トリッキーな方法があります。この行を追加するだけで、ミドルウェアCheckClientCredentialsのハンドルのメソッドを変更できます。
$request["oauth_client_id"] = $psr->getAttribute('oauth_client_id');
次に、コントローラーの関数でclient_idを取得できます。
public function info(\Illuminate\Http\Request $request)
{
var_dump($request->oauth_client_id);
}
OAuthトークンとクライアント情報は保護された変数としてLaravel\Passport\HasApiTokensトレイト(ユーザーモデルに追加)に保存されます。
したがって、ゲッターメソッドをユーザーモデルに追加して、OAuth情報を公開します。
public function get_oauth_client(){
return $this->accessToken->client;
}
これにより、oauth_clientsテーブルのEloquentモデルが返されます。
CheckClientCredentialsクラスを掘り下げ、トークンからclient_id
を取得するために必要なものを抽出しました。 aud
クレームは、client_id
が保存されている場所です。
<?php
Route::middleware('client')->group(function() {
Route::get('/client-id', function (Request $request) {
$jwt = trim(preg_replace('/^(?:\s+)?Bearer\s/', '', $request->header('authorization')));
$token = (new \Lcobucci\JWT\Parser())->parse($jwt);
return ['client_id' => $token->getClaim('aud')];
});
});
簡単にアクセスするためにこれをリファクタリングする場所はほとんどありませんが、それはアプリケーション次第です
_public function handle($request, Closure $next, $scope)
{
if (!empty($scope)) {
$psr = (new DiactorosFactory)->createRequest($request);
$psr = $this->server->validateAuthenticatedRequest($psr);
$clientId = $psr->getAttribute('oauth_client_id');
$request['oauth_client_id'] = intval($clientId);
}
return $next($request);
}
_
上記をミドルウェアファイルに追加すると、request()->oauth_client_id
でclient_idにアクセスできます