Symfony令牌getCredentials返回null

时间:2018-01-29 11:29:59

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

由于实现A接口的类SimplePreAuthenticatorInterface,我创建了一种使用API​​密钥对用户进行身份验证的方法。一切运作良好(用户成功通过身份验证)。

我试图存储API密钥,以便以后在用户的旅程中使用。为此,在我的班级A的验证方法中,我返回一个PreAuthenticatedToken,其中的凭据是我的API密钥。

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

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
}

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

根据你的评论:

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