web-dev-qa-db-ja.com

Laravel PassportアクセストークンによるクライアントIDの取得

いくつかのプロジェクトで使用される小さな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;

11
Walid Ammar

これを使用して、認証済みクライアントアプリにアクセスします...

$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;

ソース

9
bmatovu

トリッキーな方法があります。この行を追加するだけで、ミドルウェア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);
}
9
Marsprobe

OAuthトークンとクライアント情報は保護された変数としてLaravel\Passport\HasApiTokensトレイト(ユーザーモデルに追加)に保存されます。

したがって、ゲッターメソッドをユーザーモデルに追加して、OAuth情報を公開します。

public function get_oauth_client(){
  return $this->accessToken->client;
}

これにより、oauth_clientsテーブルのEloquentモデルが返されます。

3
Adam Albright

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')];
        });
    });

簡単にアクセスするためにこれをリファクタリングする場所はほとんどありませんが、それはアプリケーション次第です

1
James Wagoner
_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にアクセスできます

0
phnix