Laravel Passport打印个人访问令牌

时间:2017-01-09 14:13:42

标签: php laravel-5 oauth laravel-passport

我正在使用Laravel的护照包为我的rest api提供基于令牌的身份验证。现在,我使用personal access token概念来生成访问令牌。

要为单个用户生成访问令牌,我使用下面的代码生成名为“ android ”的令牌。

    $user = User::create([
                'name' => $data['name'],
                'email' => $data['email'],
                'password' => bcrypt($data['password']),
            ]);

    // Here the access token will be stored in $token variable.
    $token = $user->createToken('android')->accessToken;

    // Now the $token value would be something like
   //eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImMyNjI3YzU0YjFhNWIxZTFlMTdkODhmZTk1NzhjNzAzY2QyMTU0MzhlOD...

稍后我想在我的管理信息中心显示个人访问令牌,我很难再次获取生成的令牌。试过下面的代码,但无法获得访问令牌。

$user = User::find(1)
dd($user->tokens())

我也尝试过使用护照vue元素,但它只显示访问令牌名称,而不是实际令牌。

<passport-personal-access-tokens></passport-personal-access-tokens>

请帮我解决这个问题。

谢谢

7 个答案:

答案 0 :(得分:2)

我认为您应该在创建用户之前或同时生成令牌并将其存储在数据库中:

添加专栏:

$table->string('token', 60)->unique();

保存令牌:

$token = $user->createToken('android')->accessToken;

$user = User::create([
    'name' => $data['name'],
    'email' => $data['email'],
    'password' => bcrypt($data['password']),
    'token' => $token,
]);

然后它将以:

的形式提供
$user->token;

答案 1 :(得分:2)

我面对类似的问题与laravel&amp; vue js我更新了我的中间件处理程序,允许访问授权令牌。它找工作找我。一段时间它会有所帮助 https://sebastiandobrincu.com/blog/how-to-upload-images-to-rails-api-using-s3

答案 2 :(得分:2)

您可以尝试以下代码:

    $user->tokens->load('client')->filter(function ($token) {
        return ! $token->client->firstParty() && ! $token->revoked;
    })->values();

答案 3 :(得分:0)

这是我的解决方案。

我创建了一个configure passport迁移来安装客户端并将oauth_access_tokens表中的name列修改为longtext,因此我可以使用它来存储访问令牌。

public function up()
{
    /*
     * This command will create the encryption keys needed to generate secure access tokens.
     * In addition, the command will create "personal access" and "password grant"
     * clients which will be used to generate access tokens
     */
    Artisan::call( 'passport:install', array('-n' => true) );

    // Set the type to LONGTEXT so we can store the access token in it
    Schema::table( 'oauth_access_tokens', function ($table) {

        $table->string( 'name', 4294967295 )->change();
    });
}

然后我将以下方法添加到我的用户模型中。

/**
 * Get the users api access token.
 */
public function getAccessToken() {

    $existingToken = $this->tokens()->where( 'revoked', false )->first();

    if ( $existingToken ) {

        return $existingToken->name;
    }

    $accessToken = $this->createToken( $this->uuid )->accessToken;

    // save the access_token so we can recycle it.
    $this->tokens()->where( 'revoked', false )->update( [
        'name' => $accessToken,
    ] );

    return $accessToken;
}

然后在我的变换器中我可以调用它来检索用户访问令牌,或者创建一个。

/**
 * A Fractal transformer.
 *
 * @param User $user
 * @return array
 */
public function transform(User $user) {

    return [
        'access_token' => $user->getAccessToken(),
    ];
}

答案 4 :(得分:0)

我遇到了同样的问题,很难获取客户端应该使用的令牌。将令牌存储到数据库时我也感到很奇怪,我以为我在某种程度上复制数据。

经过大量的研究后,我调整了一个Trait,现在我可以做到这一点。

检查this gist它也可以解决您的问题。

答案 5 :(得分:0)

我也遇到了同样的问题。我用laravel documentation中描述的命令解决了它。只需转到php project并为护照创建一个客户端,打开您的终端或cmd并执行命令LiveData.removeObserver(Observer)

答案 6 :(得分:0)

您无法直接检索 access_token。因为,当您创建访问令牌 $token = $user->createToken('android')->accessToken; 时,Laravel Passport 将创建 access_token 并且它不会直接存储到数据库中。相反,它将 access_token 的 id(称为 Json Token Id)存储到 oauth_access_tokens 表中。

所以,当你直接在access_token表中搜索oauth_access_tokens时,你永远找不到那个access_token,只有你能看到它的Json Token Id

<块引用>

例如:access_token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIxIiwianRpIjoiNTMxYTAyYTBkMjA4N2MyZWI3NDU1MWM0NzkzZGM3OTJkYWM3ZmRmYTcyOTVjZGI1NWNjMDg4NDFiMDUyZTc5M2ViMTE5NDg3ZmNhYWUxODciLCJpYXQiOjE2MjMxMjU3MjYuNjgyMzE2LCJuYmYiOjE2MjMxMjU3MjYuNjgyMzIsImV4cCI6MTY1NDY2MTcyNi42NzQwMzYsInN1YiI6IjQiLCJzY29wZXMiOltdfQ.hCfn7mPgrNoD-kHXjgXawoil50jBzh78s_7MBq-GRUOD7fNKzEn-24mHT_qppu5v-TAlJSww0iR-zPCe82_FB4JlmR0D1ERwVdX_DD1wKcn2DR9mhCKdB8XNLsu4MZMqhPahO7ft2mC8Hu7lM6zhfgKiAkiNsR68zUbCLYB7_h82T-ef5Xp6Lp61wfSq_KATVpEkv59jp62PSdNyF3SLPT5bqfOOwziJxv2lMW1Y61M4WY_3f4prwVfA81qo_XkczBC4b9-j36ly7YluzbVHRQnNGzTRkekv8fuv4Q3USRdRkWDFR2lTJ9zz31LEN8jbnY9hoAkvE57KyEyJ3qfUzkoYFXaAIF9VQe6j8TtNGOehiAf9uQm049m0zopL5w-g4u5qulJeYp0OEgfq6nK8DtuAERSgEAeY2kINqbLenhywwJmX70mrF_BqfxaZS7MIomyybOWi6FVHj4WXA8OIPgrUUu2BAtgwdCtt-ECN6svCvBLV15nBXi6OPpbSFbbV2Ve4fy2kGH5dWUfKZe0W6Cai0Uux_lUVDSx6q6bo4bf5_67Twg2E7EI4CpzyCk7g_ZG3Ff3vdTTs8P5f0LIHihCjCp6c_cuLnws8laD1L1-rqBmCQSZ7ZGeI-LYouWEbtXnf6M4xlfJoubXZGiTi8Zun9X2EhgRR8XjviOWM8AU

它的 Json 令牌 ID: 87dcc72560f41406d6cec1f35a66c24ac65953f2e8b28401e06e282c340eba7ef2c2fee65a0a0519