【问题标题】:Laravel Passport Print Personal Access TokenLaravel Passport 打印个人访问令牌
【发布时间】:2017-05-23 19:49:24
【问题描述】:

我正在使用 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>

请帮我解决这个问题。

谢谢

【问题讨论】:

  • 您检查过数据库是否成功创建了令牌?
  • dd($user-&gt;tokens()) 返回构建器,而不是令牌。尝试不带 () 的 dd($user-&gt;tokens)。 @ceejayoz 说的是,如果令牌在那里,请检查您的数据库。您也可以简单地检查dd($user-&gt;tokens()-&gt;first())
  • @Robert 是对的,试试看
  • @Robert 它给出了令牌 ID,但没有给出实际的令牌。像这样 {"id":"3e7cb4aa1e6c94965cf1a7ca7d0ac580ac48f2c0fe7186d2c66aaf536f97798904d570a94080431c","user_id":3,"client_id":1,"name":"android","scopes":[],"revoked":71,"created_at":"20 -01-17 05:15:11","updated_at":"2017-01-17 05:15:11","expires_at":"2027-01-17 05:15:11"}

标签: php laravel-5 oauth laravel-passport


【解决方案1】:

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

添加列:

$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;

【讨论】:

  • 有时这将是正确的缺少'token' => $token,将是原因。
  • 我已经这样做了,但我不想再次复制这个令牌,因为它已经存储在护照表的某个地方。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你可以试试下面的代码:

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

    【讨论】:

    • 打印空数组。
    • @Minion 试试这个:$user-&gt;tokens-&gt;load('client')-&gt;filter(function ($token) { return $token-&gt;client-&gt;personal_access_client &amp;&amp; ! $token-&gt;revoked; })-&gt;values();
    【解决方案4】:

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

    因此,当您直接在oauth_access_tokens 表中搜索access_token 时,您永远不会找到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 P>

    它的 Json 令牌 ID: 87dcc72560f41406d6cec1f35a66c24ac65953f2e8b28401e06e282c340eba7ef2c2fee65a0a0519

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

        这是我的解决方案。

        我创建了一个配置护照迁移来安装客户端并将 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(),
            ];
        }
        

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2018-06-02
            • 2019-06-09
            • 2017-03-26
            • 2020-04-09
            • 2018-11-10
            • 2018-04-23
            • 2017-12-15
            • 2019-02-14
            • 1970-01-01
            相关资源
            最近更新 更多