创建laravel护照令牌

时间:2019-09-12 17:56:48

标签: laravel laravel-passport

我想创建一个控制器,其作用类似于laravel Passport / oauth / token控制器。 我怎样才能做到这一点? (我想将我发送的所有参数发送到oauth / token并检查它们)。

我知道我可以创建这样的令牌:

User::find('1')->createToken('token')->accessToken;

但是我想设置oauth_client并检查所有这些:

grant_type
grant_type
client_secret
username
password

谢谢!

1 个答案:

答案 0 :(得分:0)

要创建和签名自己的令牌,可以扩展Passport的Token类并添加一个convertToJWT方法。这是一个如何构建自己的令牌的示例:

<?php

namespace App;

use Laravel\Passport\Passport;
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Key;
use Lcobucci\JWT\Signer\Rsa\Sha256;
use League\OAuth2\Server\CryptKey;

class CustomToken extends \Laravel\Passport\Token
{
    /**
     * Generate a JWT from the access token
     *
     * @return string
     */
    public function convertToJWT()
    {
        $privateKey = new CryptKey(
            'file://' . Passport::keyPath('oauth-private.key'),
            null,
            false
        );

        return (string) (new Builder())
            ->setAudience($this->client_id)
            ->setId($this->id, true)
            ->setIssuedAt(time())
            ->setNotBefore(time())
            ->setExpiration($this->expires_at->getTimestamp())
            ->setSubject($this->user->id)
            ->set('scopes', [])
            ->sign(new Sha256(), new Key($privateKey->getKeyPath(), $privateKey->getPassPhrase()))
            ->getToken();
    }
}

然后可以通过使用所需属性调用构造函数来创建新令牌。 Token继承自Model,因此构造方法采用$attributes数组,其中键应与oauth_access_tokens中的列名匹配。创建该令牌后,您可以使用convertToJWT()方法并在响应中返回该令牌:

public function myControllerFunction(Request $request) {
  $token = new CustomToken([...]);
  $access_token = $token->convertToJWT();
  return json(["access_token" => $access_token]);
}