Symfony 5 ApiKeyAuthenticator 和 SelfValidatingPassport

Posted

技术标签:

【中文标题】Symfony 5 ApiKeyAuthenticator 和 SelfValidatingPassport【英文标题】:Symfony 5 ApiKeyAuthenticator with SelfValidatingPassport 【发布时间】:2021-11-10 10:06:44 【问题描述】:

我正在开发一个新的 Symfony 5.3.6 项目,并希望根据新系统实现身份验证,如下所述:

https://symfony.com/doc/current/security/authenticator_manager.html#creating-a-custom-authenticator

我没有任何用户,只是想检查发送的api令牌是否正确,所以在实现此方法时:

public function authenticate(Request $request): PassportInterface

    $apiToken = $request->headers->get('X-AUTH-TOKEN');

    if (null === $apiToken) 
        // The token header was empty, authentication fails with HTTP Status Code 401 "Unauthorized"
        throw new CustomUserMessageAuthenticationException('No API token provided');
    

    return new SelfValidatingPassport(new UserBadge($apiToken));


检查具体在哪里进行?我是否忘记在某处实现另一个类?

如果我保留代码原样,它会直接进入onAuthenticationFailure

我明白,我可以使用属性 $apiToken 实现 Users/UserProvider,然后系统将检查数据库条目是否与请求中的令牌对应。但我没有用户。

在没有用户的情况下应该是可能的,因为在上面的 URL 上,它说:

自我验证护照

如果您不需要检查任何凭据(例如,在使用 API 时 令牌),您可以使用 Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport。 这个类只需要一个 UserBadge 对象和可选的 Passport 徽章。

但这有点薄。我如何“使用”它?

【问题讨论】:

【参考方案1】:

你可以使用下一个验证

return new SelfValidatingPassport(
    new UserBadge($apiToken, function() use ($apiToken) 
        // TODO: here you can implement any check
    )
);

【讨论】:

+1 一般的答案。毕竟,我切换到拥有用户,以使其正常工作。如果有人可以发表评论并确认此方法,我很乐意将其标记为答案。或者也许我有另一个项目或一些空闲时间,然后我会自己验证。 对我来说,它完全不可能让它工作,文档操作系统如此混乱且写得不好,它什么也没说。 api 令牌身份验证对我不起作用

以上是关于Symfony 5 ApiKeyAuthenticator 和 SelfValidatingPassport的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 5.2.3 接口类型提示

Symfony 5 邮件问题

Symfony 5 ApiKeyAuthenticator 和 SelfValidatingPassport

无法使用 Symfony 5 安装 FOSRestBundle

Symfony 5.1 弃用 RouteCollectionBuilder -> RoutingConfigurator

升级到 Symfony 5.3 并更新 flex 配方后出错 (symfony:recipes:install --force)