【问题标题】:Get Password Grant Tokens without http request for Laravel passport无需对 Laravel 护照的 http 请求即可获取密码授予令牌
【发布时间】:2017-07-09 15:11:05
【问题描述】:

我正在使用 Laravel 5.4(护照)开发一个 REST API。

我希望用户在注册时获得访问令牌,而无需发出另一个 http 请求。 我已经阅读了 Laravel 文档。但是没有直接的方法来获取访问令牌。类似:-

$token = $user->getOathToken($user_id);

password grant token 的护照文件

在文档中,他们提供如下内容:

    $http = new GuzzleHttp\Client;

    $response = $http->post('http://your-app.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'refresh_token',
            'refresh_token' => 'the-refresh-token',
            'client_id' => 'client-id',
            'client_secret' => 'client-secret',
            'scope' => '',
        ],
    ]);

return json_decode((string) $response->getBody(), true);

我不想发出另一个 http 请求。有什么办法可以避免吗?

【问题讨论】:

    标签: laravel-5 oauth-2.0 laravel-passport


    【解决方案1】:

    经过研究,这是一个可以完成您正在寻找的工作的课程

    use Laravel\Passport\Http\Controllers\ConvertsPsrResponses;
    use League\OAuth2\Server\AuthorizationServer;
    use Zend\Diactoros\Response as Psr7Response;
    use Zend\Diactoros\ServerRequest;
    
    class TokenProvider
    {
        use ConvertsPsrResponses;
    
        /**
         * @var AuthorizationServer
         */
        private $authServer;
    
        public function __construct()
        {
    
            $this->authServer = resolve(AuthorizationServer::class);
        }
    
        public function getToken(string $email, string $password)
        {
            $data = [
                'grant_type' => 'password',
                'client_id' => config('services.passport.client_id'),
                'client_secret' => config('services.passport.client_secret'),
                'username' => $email,
                'password' => $password
            ];
            $request = new ServerRequest($data);
            $request = $request->withParsedBody($data);
            $response = $this->convertResponse($this->authServer->respondToAccessTokenRequest($request,new Psr7Response));
            return json_decode($response->content())->access_token;
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      没有一种方法可以用来做你想做的事。你可以看看

      \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken
      

      这是处理/oauth/token 路由的控制器方法。并查看将所需参数传递给它,而不是作为 POST 请求进行。

      【讨论】:

      • 提供这种类型的功能不是很明显,还是我错过了有关护照工作流程的一些东西?
      • 并非如此,passport 旨在允许用户为第 3 方应用程序为自己生成令牌,或在登录第 1 方应用程序时(使用密码授予)。您可以在身份验证承载标头中使用 CSRF 令牌,对于“本地”请求,这是本地服务的 vuejs 前端进行身份验证的方式。
      猜你喜欢
      • 2017-10-05
      • 1970-01-01
      • 2017-04-09
      • 2023-03-27
      • 2019-09-13
      • 2018-02-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多