Настройка ответа на токен Laravel Passport

Настройка ответа на токен Laravel Passport

31.03.2017 09:00:50 Просмотров 30 Источник

В данный момент я работаю над API и наткнулся на кирпичную стену. Я использую паспорт с типом гранта "пароль".

Я хочу вернуть информацию о пользователе с помощью маркеров доступа, однако не знаю, как это сделать.

Какой класс я мог бы реализовать, отредактировать или расширить, чтобы получить это?.

Я бы хотел, чтобы это было возвращено.:

{
    "token_type": "Bearer",
    "expires_in": 31536000,
    "access_token": "lalalalalal",
    "refresh_token": "lalalallala",
    "user": {
        "username": "a username",
        "user_type": "admin"
    }
}

Заранее спасибо.

У вопроса есть решение - Посмотреть?

Ответы - Настройка ответа на токен Laravel Passport / Customising token response Laravel Passport

cyberfly

16.03.2018 06:32:11

Еще один лучший ответ из интернета

Таможня Laravel Passport BearerTokenResponse

https://gist.github.com/messi89/489473c053e3ea8d9e034b0032effb1d

https://stackoverflow.com/questions/43146964/customising-token-response-laravel-passport/49312741#comment91921185_49312741
Хотя этот ответ получил больше откликов, чем любой другой, по состоянию на 25 сентября 2018 года, он не считается высококачественным ответом, так как он только для ссылок.
Albert Cloete

16.03.2018 01:41:12

Два шага.

1. Добавьте новый маршрут в файл маршрутов.

// routes/api.php

Route::post('oauth/token', 'AuthController@auth');

Имейте в виду, что это изменит маршрут для получения токена из /oauth/tokenв /api/oauth/token.

2. Добавьте метод контроллера.

<?php
// app/Http/Controllers/AuthController.php

namespace App\Http\Controllers;

use App\User;
use Psr\Http\Message\ServerRequestInterface;
use \Laravel\Passport\Http\Controllers\AccessTokenController;

class AuthController extends AccessTokenController
{
    public function auth(ServerRequestInterface $request)
    {
            $tokenResponse = parent::issueToken($request);
            $token = $tokenResponse->getContent();

            // $tokenInfo will contain the usual Laravel Passort token response.
            $tokenInfo = json_decode($token, true);

            // Then we just add the user to the response before returning it.
            $username = $request->getParsedBody()['username'];
            $user = User::whereEmail($username)->first();
            $tokenInfo = collect($tokenInfo);
            $tokenInfo->put('user', $user);

            return $tokenInfo;
    }
}
escapisam

04.01.2019 06:52:00

Инструкции о том, как это сделать, содержатся в BearerTokenResponseкласс BearerTokenResponse, добавьте дополнительные параметры, которые вам нужны в ответе .

BearerTokenResponse

2. Создайте свой собственный namespace App\Auth; use League\OAuth2\Server\Entities\AccessTokenEntityInterface; class BearerTokenResponse extends \League\OAuth2\Server\ResponseTypes\BearerTokenResponse { /** * Add custom fields to your Bearer Token response here, then override * AuthorizationServer::getResponseType() to pull in your version of * this class rather than the default. * * @param AccessTokenEntityInterface $accessToken * * @return array */ protected function getExtraParams(AccessTokenEntityInterface $accessToken): array { return [ 'user_id' => $this->accessToken->getUserIdentifier(), ]; } } для передачи в свой собственный PassportServiceProvider

3. Добавьте поставщика в массив поставщиков в makeAuthorizationServer()

BearerTokenResponse

4. Исключить паспорт пакет с фреймворк Laravel автоматическое обнаружение в namespace App\Providers; use App\Auth\BearerTokenResponse; use Laravel\Passport\Bridge; use League\OAuth2\Server\AuthorizationServer; class PassportServiceProvider extends \Laravel\Passport\PassportServiceProvider { /** * Make the authorization service instance. * * @return \League\OAuth2\Server\AuthorizationServer */ public function makeAuthorizationServer() { return new AuthorizationServer( $this->app->make(Bridge\ClientRepository::class), $this->app->make(Bridge\AccessTokenRepository::class), $this->app->make(Bridge\ScopeRepository::class), $this->makeCryptKey('private'), app('encrypter')->getKey(), new BearerTokenResponse() // <-- The class you created above ); } }

Это останавливает config/app.php

Затем запустите /* * Application Service Providers... */ App\Providers\PassportServiceProvider::class, .

https://stackoverflow.com/questions/43146964/customising-token-response-laravel-passport/54032911#comment95846192_54032911
Привет! Добавление "dont-discover"для всех laravel/passportне вызовет проблем с композитором, не загружающим автоматически другие необходимые классы для Passport???
https://stackoverflow.com/questions/43146964/customising-token-response-laravel-passport/54032911#comment95847107_54032911
Кроме того, вместо composer install, composer dump-autoloadне будет более подходящим?
https://stackoverflow.com/questions/43146964/customising-token-response-laravel-passport/54032911#comment95847656_54032911
Похоже, это сработало на меня. По-видимому, это самый простой способ сделать это в данный момент.
https://stackoverflow.com/questions/43146964/customising-token-response-laravel-passport/54032911#comment98899999_54032911
Я бы сказал, что это чистое решение. Я тестировал в laravel 5.8, и это работает.
Leo Nogueira

15.06.2019 12:46:08

Я использую Multi-Auth с паспортом, поэтому предыдущие ответы мне не помогли.

После нескольких часов "гугления" я нашел этот ответ (после-) middleware .

Мое промежуточное программное обеспечение в основном получает результат проверки подлинности паспорта, проверяет, есть ли внутри носитель, и добавляет больше данных к содержимому.

<?php

namespace App\Http\Middleware;

use Closure;

class AppendTokenResponse
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        $response =  $next($request);

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

        if (!empty($content['access_token'])) {

            $content['moredata'] = 'some data';

            $response->setContent($content);

        }

        return $response;
    }
}

Теперь поместите новое промежуточное ПО в $routemiddleware в App / Http / Kernel.РНР

 /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'cors' => \App\Http\Middleware\Cors::class,
        'multiauth' => \SMartins\PassportMultiauth\Http\Middleware\MultiAuthenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'oauth.providers' => \SMartins\PassportMultiauth\Http\Middleware\AddCustomProvider::class,
        'append_auth' =>\App\Http\Middleware\AppendTokenResponse::class,

    ];

Затем просто зарегистрируйте это промежуточное ПО для паспортизации маршрутов в Providers / AuthServiceProvider.РНР

С Multiauth:

Route::group(['middleware' => ['oauth.providers','append_auth']], function () {
    Passport::routes(function ($router) {
        return $router->forAccessTokens();
    });
});

Я считаю, что обычный паспорт должен быть (не проверен):

Route::group(['middleware' => ['append_auth']], function () {
    Passport::routes();
});
Закрыть X