Laravel Passport Получить идентификатор клиента по токену доступа

Я пишу крошечный смс-шлюз, который будет использован несколькими проектами,

Я реализовал паспортную аутентификацию 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);
});

По очевидным причинам безопасности я никогда не могу отправить идентификатор клиента с запросом потребителя, например, $client_id = $request->client_id;,

8

Решение

Есть хитрый метод.
Вы можете изменить метод обработки в промежуточном программном обеспечении 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

Другие решения

Итак, ответов нет …

Я смог решить проблему, используя свой собственный API, и, наконец, я пришел к более простому процессу аутентификации, клиент должен отправить свой идентификатор & секрет с каждой просьбой, то я потребляю свою /oauth/token маршрут с отправленными учетными данными, вдохновленный Эсбен Петерсен Сообщение блога.

После того как токен доступа сгенерирован, я добавляю его в заголовки Symfony\Request экземпляр, который находится в стадии обработки.

Мой окончательный вывод, как это:

<?php

namespace App\Http\Middleware;

use Request;

use Closure;

class AddAccessTokenHeader
{
/**
* Octipus\ApiConsumer
* @var ApiConsumer
*/
private $apiConsumer;function __construct() {
$this->apiConsumer  = app()->make('apiconsumer');
}

/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $this->apiConsumer->post('/oauth/token', $request->input(), [
'content-type' => 'application/json'
]);if (!$response->isSuccessful()) {
return response($response->getContent(), 401)
->header('content-type', 'application/json');
}

$response = json_decode($response->getContent(), true);

$request->headers->add([
'Authorization'     => 'Bearer ' . $response['access_token'],
'X-Requested-With'  => 'XMLHttpRequest'
]);

return $next($request);

}
}

Я использовал вышеуказанное промежуточное ПО в сочетании с Passport’s CheckClientCredentials,

protected $middlewareGroups = [
'web' => [
...
],

'api' => [
'throttle:60,1',
'bindings',
\App\Http\Middleware\AddAccessTokenHeader::class,
\Laravel\Passport\Http\Middleware\CheckClientCredentials::class
],
];

Таким образом, я смог обеспечить $request->input('client_id') надежен и не может быть подделан

3

Токен OAuth и информация о клиенте хранятся в виде защищенная переменная в признаке Laravel \ Passport \ HasApiTokens (который вы добавляете в свою модель User).

Так что просто добавьте метод получения к вашему Модель пользователя раскрыть информацию OAuth:

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

Это вернет модель Eloquent для таблицы oauth_clients

3

Я копался в классе 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
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);
}

поместите выше в ваш файл промежуточного программного обеспечения, тогда вы можете получить доступ к client_id request()->oauth_client_id

0

Я использую это, чтобы получить доступ к аутентифицированному клиентскому приложению …

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

Источник

0
По вопросам рекламы [email protected]