由于实现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()
);
答案 0 :(得分:1)
广告1.这取决于您的AuthenticationProviderManager
:此类接受$eraseCredentials
作为第二个参数 - 默认设置为true
(here)。
这就是为什么eraseCredentials
PreAuthenticatedToken
方法在认证(here)期间在$token
ApiKeyAuthenticator
上被调用的原因。
广告2.请查看How to Authenticate Users with API Keys教程。您应该创建自定义authenticateMethod
类并在那里添加逻辑。
根据你的评论:
请注意,在authenticate
方法(here)中调用了教程中的image of a country
。此时令牌凭据尚未被删除,您可以访问它们。出于安全原因,它们在验证后被删除(但也可以通过security.yml文件进行更改/配置)。如果以后需要它们,可以在那里引入自定义令牌类和存储API密钥。