代码之家  ›  专栏  ›  技术社区  ›  Profitroll

Symfony token getCredentials返回null

  •  3
  • Profitroll  · 技术社区  · 6 年前

    由于类,我创建了一种使用API密钥对用户进行身份验证的方法 A 实施 SimplePreAuthenticatorInterface 界面一切正常(用户已成功通过身份验证)。

    我正在尝试存储API密钥,以便在用户的旅程中稍后使用。为此,在类的authenticate方法中 A. ,我返回a PreAuthenticatedToken 其中凭据是我的API密钥。

    问题是:在自定义服务中,当我尝试获取令牌凭据时 null ... 在注释 预认证Token Symfony核心等级:

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

    我的问题是:
    1) 为什么是这种方法 eraseCredentials 调用,而用户经过身份验证?我以为这个方法是在用户注销时调用的。。。
    2) 我做错了什么?是 预认证Token 标记存储API密钥的正确位置?如何从定制服务中取回它们?

    谢谢你帮助我。:)

    附言:我是Stackoverflow(和英文^^^)的新手。对于任何错误,请提前道歉。

    我发现 another similar question 但这并没有什么帮助,我补充了一些更精确的说法。

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

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

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

    return new PreAuthenticatedToken(
        $user,
        $apiKeys,
        $providerKey,
        $user->getRoles()
    );
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Kamil Adryjanek    6 年前

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

    这就是为什么 eraseCredentials 正在调用方法 PreAuthenticatedToken $token 授权期间( here ).

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

    根据您的评论:

    请注意 authenticateMethod 从教程中调用 authenticate 方法( here ). 此时,令牌凭据尚未擦除,您可以访问它们。出于安全原因,它们在身份验证后被擦除(但也可以通过 security.yml 文件)。如果以后需要它们,可以引入自定义令牌类并将API密钥存储在其中。