定制令牌响应Laravel Passport

定制令牌响应Laravel Passport,laravel,oauth-2.0,laravel-passport,Laravel,Oauth 2.0,Laravel Passport,我目前正在开发一个API,遇到了麻烦。我正在使用带有“密码”授权类型的Passport 我想用访问令牌返回用户信息,但是,我不知道如何返回 我可以实现、编辑或扩展哪个类来获得这个 我想把这个退回: { "token_type": "Bearer", "expires_in": 31536000, "access_token": "lalalalalal", "refresh_token": "lalalallala", "user": {

我目前正在开发一个API,遇到了麻烦。我正在使用带有“密码”授权类型的Passport

我想用访问令牌返回用户信息,但是,我不知道如何返回

我可以实现、编辑或扩展哪个类来获得这个

我想把这个退回:

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

提前感谢。

另一个更好的答案来自网络

海关拉威尔护照持有人

两个步骤

1在路由文件中添加新路由。

// routes/api.php

Route::post('oauth/token', 'AuthController@auth');
<?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;
    }
}
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
        );
    }
}
请记住,这将更改从
/oauth/token
/api/oauth/token
获取令牌的路径

2添加控制器方法。

// routes/api.php

Route::post('oauth/token', 'AuthController@auth');
<?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;
    }
}
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
        );
    }
}

类(league/oauth2服务器包的一部分)中暗示了如何执行此操作的说明

在Laravel 5.7上测试

1。扩展
BearerTokenResponse
类,在响应中添加所需的额外参数

2。创建您自己的
PassportServiceProvider
类并重写
makeAuthorizationServer()
方法,以便传入您自己的
BealerTokenResponse
类。

// routes/api.php

Route::post('oauth/token', 'AuthController@auth');
<?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;
    }
}
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
        );
    }
}
4。从
composer.json中的laravel自动发现中排除passport包

    /*
     * Application Service Providers...
     */
    App\Providers\PassportServiceProvider::class,
这将停止加载默认的
PassportServiceProvider

    "extra": {
        "laravel": {
            "dont-discover": [
                "laravel/passport"
            ]
        }
    },
然后运行
composer安装

imusing,所以前面的答案对我没有帮助

经过几个小时的“谷歌搜索”,我找到了这个答案

我的中间件基本上得到Passport auth的结果,检查里面是否有承载者,并向内容添加更多数据

<?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;
    }
}
然后只需在Providers/AuthServiceProvider.php中将此中间件注册到Passport路由

使用Multiauth:

Route::group(['middleware' => ['oauth.providers','append_auth']], function () {
    Passport::routes(function ($router) {
        return $router->forAccessTokens();
    });
});
我认为普通护照应该(未经测试):


要将自定义声明添加到您的Passport令牌中,以下是使用Passport 8和Laravel 6的要点


可能重复的答案尽管截至2018年9月25日,该答案获得了比任何其他答案更多的投票,但由于其仅为链接,因此不被视为高质量答案。嗨!为所有
laravel/passport
添加
“不发现”
选项不会导致composer无法自动加载passport所需的其他类的问题???此外,除了
composer安装
composer转储自动加载
不会更合适吗?它似乎对我有效。显然,这是目前最简单的方法。我会说,这是一个干净的解决方案。我在laravel 5.8中进行了测试,它正在工作。这会导致无效的令牌签名吗?