Laravel Passport:API 的令牌是不是存储在服务器上,存储在哪里?

Posted

技术标签:

【中文标题】Laravel Passport:API 的令牌是不是存储在服务器上,存储在哪里?【英文标题】:Laravel Passport: Are API's tokens stored on the server, and where?Laravel Passport:API 的令牌是否存储在服务器上,存储在哪里? 【发布时间】:2018-10-19 14:56:57 【问题描述】:

我试图找到$user->createToken('MyApp')->accessToken; 方法返回的令牌在数据库中的存储位置,但我似乎找不到它。它首先存储在服务器中吗?如果有,在哪里?

如果因为自包含而不存储在服务器上,为什么 Laravel 的开发人员将 $table->rememberToken(); 放在默认的 create_users_table.php 迁移中? remember_token这个专栏的目的是什么?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

我猜你可以说令牌的一些部分存储在数据库中。

返回的令牌是JWT(JSON Web 令牌)。其中编码了有关令牌的信息,例如它的到期时间、用于散列它的算法、令牌范围和它的 ID(在有效负载中它被命名为jti)。该 ID 存储在 oauth_access_tokens 表中。

\Laravel\Passport\PersonalAccessTokenFactory::findAccessToken 类的这个方法中,你可以看到 Laravel 如何检查令牌是否在数据库中:

 /**
 * Get the access token instance for the parsed response.
 *
 * @param  array  $response
 * @return Token
 */
protected function findAccessToken(array $response)

    return $this->tokens->find(
        $this->jwt->parse($response['access_token'])->getClaim('jti')
    );

如果您获得一个有效的令牌并将其粘贴到this online tool,您将看到它的结构。这是它的外观:

现在,知道了负载的预期格式,如果您使用此信息和您在oauth_access_tokens 中的数据(ID、范围、创建和到期日期)进行一些尝试,您应该能够创建一个有效的令牌。

【讨论】:

只使用token id进行授权是个好习惯吗?我们不需要过期日期,并且范围正在服务器端检查。 很好的答案!有没有办法像护照一样从 oauth_access_tokens.id 手动编码“access_token”? 不错!想知道护照是如何通过access_token 识别用户的,谢谢!!【参考方案2】:

用户表中的记住令牌用于在您登录网络时“记住我”。 Laravel: What is “remember_token” in the “users” DB table?

如果您使用护照并创建 API,您可以在数据库的 oauth_access_tokens 中找到令牌 ID。

【讨论】:

谢谢,但这不完全一样。 oauth_access_tokens 表中的 id 远小于 $user->createToken('MyApp')->accessToken; 返回的值。【参考方案3】:

不,访问令牌值不会存储在任何地方。如果你失去它,它就消失了。您需要重新生成一个新令牌。

rememeber_token 字段用于正常 Web 身份验证的“记住我”功能。和 Passport API 认证一点关系都没有。

【讨论】:

想知道如果实际令牌没有保存在数据库中的任何地方它是如何工作的..尝试搜索系统文件但找不到任何东西

以上是关于Laravel Passport:API 的令牌是不是存储在服务器上,存储在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Passport API:检索经过身份验证的令牌

如何使用 Laravel Passport 验证令牌?

Laravel 通过 Passport 实现 API 请求认证:沙箱测试篇(私人访问令牌)

如何使用 Laravel Passport 访问令牌

Laravel 通过 Passport 实现 API 请求认证:开放平台篇(客户端凭证令牌)

如何将自定义数据添加到 Laravel Passport API 令牌?