【问题标题】:Symfony token getCredentials returns nullSymfony 令牌 getCredentials 返回 null
【发布时间】:2018-01-29 11:29:58
【问题描述】:

我创建了一种使用 API 密钥对用户进行身份验证的方法,这要归功于实现 SimplePreAuthenticatorInterface 接口的类 A。一切正常(用户已成功通过身份验证)。

我正在尝试存储 API 密钥,以供以后在用户的旅程中使用。为此,在我的类 A 的身份验证方法中,我返回一个 PreAuthenticatedToken,其中的凭据是我的 API 密钥。

问题是:在自定义服务中,当我尝试获取令牌凭据时,我得到null...当我评论PreAuthenticatedToken Symfony 核心类的第 76 行时,我成功获取了 API 密钥:

public function eraseCredentials()
{
    parent::eraseCredentials();
    //$this->credentials = null;
}

我的问题是:
1) 为什么在用户通过身份验证时调用eraseCredentials 方法?我认为在用户注销期间调用了此方法...
2)我做错了什么? PreAuthenticatedToken 令牌是存储我的 API 密钥的正确位置吗?如何从自定义服务中取回它们?

感谢您帮助我。 :)

PS:我是在 Stackoverflow 上发帖的新手(和英文 ^^)。如有任何错误,请提前道歉。

我找到了another similar question,但它没有任何帮助,我添加了一些更精确的信息。

编辑:我尝试获取凭据的自定义服务代码是:

$token = $this->container->get("security.token_storage")->getToken();
if ($token !== null) {
  $credentials = $token->getCredentials();
  // $credentials is null here
}

编辑 2SimplePreAuthenticatorInterface::authenticateToken 方法代码中的返回部分:

return new PreAuthenticatedToken(
    $user,
    $apiKeys,
    $providerKey,
    $user->getRoles()
);

【问题讨论】:

    标签: php symfony authentication single-sign-on token


    【解决方案1】:

    广告 1. 这取决于您的 AuthenticationProviderManager:该类接受 $eraseCredentials 作为第二个参数 - 默认设置为 true (here)。

    这就是为什么在身份验证 (here) 期间在 PreAuthenticatedToken $token 上调用 eraseCredentials 方法的原因。

    广告 2。请查看How to Authenticate Users with API Keys 教程。您应该创建您的自定义 ApiKeyAuthenticator 类并在那里添加逻辑。

    根据您的评论:

    请注意,教程中的authenticateMethodauthenticate 方法(here)中被调用。那时令牌凭据尚未删除,您可以访问它们。出于安全原因,它们在身份验证后会被删除(但这也可以通过security.yml 文件进行更改/配置)。如果您以后需要它们,您可以引入自定义令牌类并在那里存储 API 密钥。

    【讨论】:

    • 对于 1) :我不知道 AuthenticationProviderManager。但是我读到出于安全原因,即使用户经过身份验证,也会调用eraseCredentials。对于 2) :我刚刚编辑 (EDIT2) 我的问题以供您回答。根据教程,我的 api 密钥存储在令牌的凭据中。这就是为什么我不明白教程如何让我在实际调用 eraseCredentials 时取回我的 api 密钥......
    • 我知道这个问题已经很老了,但我真的很想知道 security.yml 中应该使用哪些设置,以防止在身份验证后抑制凭据。这可以在不需要自定义 AuthenticationProviderManager 的情况下完成吗?
    • 好吧,如果其他人正在寻找答案,可以在 security.yaml 中设置 AuthenticationProviderManager 的 erase_credential 的值。在安全下:,只需添加erase_credentials:false
    猜你喜欢
    • 1970-01-01
    • 2019-04-28
    • 2017-04-13
    • 2021-01-22
    • 1970-01-01
    • 2017-08-27
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多