12

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

为了为单个用户生成访问令牌,我使用下面的代码来生成一个名为“ 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>

请帮我解决这个问题。

谢谢

4

7 回答 7

3

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

添加列:

$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;
于 2017-01-12T15:27:21.623 回答
2

我在 laravel 和 vue js 上遇到了类似的问题 ii 更新了我的中间件处理程序允许访问授权令牌。它对我有用。有时它会帮助 Laravel Passport 401 Unauthorized Error using Apache and Vue

于 2017-01-13T11:32:19.177 回答
2

您可以尝试以下代码:

    $user->tokens->load('client')->filter(function ($token) {
        return ! $token->client->firstParty() && ! $token->revoked;
    })->values();
于 2017-01-15T00:44:16.140 回答
1

不能access_token直接取回。因为,当您创建 access token 时$token = $user->createToken('android')->accessToken;,Laravel Passport 将创建access_token并且它不会直接存储到数据库中。相反,它将access_tokenid(称为 Json Token Id)存储到oauth_access_tokens表中。

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

Eg: 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

于 2021-06-08T05:29:16.000 回答
0

我遇到了同样的问题,奇怪的是很难获取客户端应该使用的令牌。将令牌存储到数据库中我也觉得很奇怪,我在想我正在以某种方式复制数据。

因此,经过大量研究后,我调整了一个特质,现在我可以完全拥有它。

检查这个要点它也可以解决你的问题。

于 2018-05-04T12:32:25.200 回答
-1

我也面临同样的问题。我用laravel 文档中描述的命令解决了这个问题。只需转到 php 项目并为护照创建一个客户端,打开您的终端或 cmd 并执行命令php artisan passport:install

于 2019-04-03T07:59:27.027 回答
-1

这是我的解决方案。

我创建了一个配置护照迁移来安装客户端并将 oauth_access_tokens 表中的名称列修改为长文本,因此我可以使用它来存储访问令牌。

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(),
    ];
}
于 2017-04-27T09:13:40.603 回答