API中的双因素认证
编辑本页API中的双因素认证
本指南描述如何在Symfony应用程序中设置双因素身份验证,该应用程序不生成前端,而是提供API端点。ob娱乐下载
先决条件
要使双因素身份验证在API中工作,您需要API必须有状态(无状态:假
在防火墙配置中或根本没有配置,因为默认情况下它是有状态的)。这意味着API正在启动一个会话,该会话在每次调用时由客户端传递。会话对于存储登录状态的双因素身份验证是必需的——无论用户是否已经完成了双因素身份验证。
如果您使用自定义身份验证器(您可能已经遵循了Symfony的指南)ob娱乐下载带Guard的自定义认证系统(API令牌示例)),请确保您的验证程序不会对每个请求进行验证,而是只在调用验证路由时进行验证。举个例子,看看避免对每个请求都进行浏览器认证部分的Symfony指南。ob娱乐下载
设置
请注意
为简单起见,本指南假设您正在构建一个JSON API,并且您正在使用json_login
身份验证机制,由Symfony提供。ob娱乐下载对于任何其他身份验证机制,只要允许您配置自定义成功处理程序,它的工作方式应该相同或至少类似。
你需要实现4个类:
- 身份验证机制的自定义成功处理程序
- 用于双因素身份验证的自定义“需要双因素身份验证”处理程序
- 用于双因素身份验证的自定义成功处理程序
- 用于双因素身份验证的自定义失败处理程序
配置
请确保您的防火墙上设置了以下配置选项:
1 2 3 4 5 6 7 8
#配置/包/ security.yaml安全:防火墙:your_firewall_name:#……two_factor:prepare_on_login:真正的prepare_on_access_denied:真正的
1)登录响应
这是用户登录后返回的第一个响应。如果没有双重身份验证,它将返回“登录成功”或“登录失败”响应。使用双因素身份验证,您最终需要返回第三种类型的响应,告诉客户机身份验证尚未完成,需要双因素身份验证。客户端应该显示双因素身份验证表单。
如果您为用户提供多种身份验证机制来标识自己,则必须对每个用户都执行此操作。
要实现这样一个响应,你需要一个自定义的成功处理程序:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
<?php名称空间应用程序\安全;使用Scheb\TwoFactorBundle\安全\身份验证\令牌\TwoFactorTokenInterface;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\安全\Http\身份验证\AuthenticationSuccessHandlerInterface;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\TokenInterface;类AuthenticationSuccessHandler实现了AuthenticationSuccessHandlerInterface{公共函数onAuthenticationSuccess(请求$请求, TokenInterface$令牌):响应{如果($令牌运算符TwoFactorTokenInterface) {//返回通知客户端需要双因素身份验证的响应。返回新响应('{"login": "success": "2fa_complete": false}');}//如果登录成功,返回默认响应。你可以通过装饰来做到这一点//原来的身份验证成功处理程序,并在这里调用它。}}
将其注册为服务并将其配置为自定义服务success_handler
认证方式:
1 2 3 4 5 6
#配置/包/ security.yaml安全:防火墙:your_firewall_name:json_login:#您使用的身份验证机制success_handler:your_api_success_handler
2)响应要求双因素认证
您需要在用户请求路径时返回响应,但该路径(目前)还不能访问,因为用户必须首先完成双因素身份验证。这可能与您的“访问被拒绝”响应相同。
创建一个实现Scheb
返回响应。
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
<?php名称空间应用程序\安全;使用Scheb\TwoFactorBundle\安全\Http\身份验证\AuthenticationRequiredHandlerInterface;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\TokenInterface;类TwoFactorAuthenticationRequiredHandler实现了AuthenticationRequiredHandlerInterface{公共函数onAuthenticationRequired(请求$请求, TokenInterface$令牌):响应{//返回响应,告诉客户端身份验证还没有完成,并且//需要双因素认证。返回新响应('{"error": "access_denied", "2fa_complete": false}');}}
将其注册为服务并将其配置为required_handler
的two_factor
验证方法:
1 2 3 4 5 6
#配置/包/ security.yaml安全:防火墙:your_firewall_name:two_factor:authentication_required_handler:your_api_2fa_required_handler
3)双因素认证成功时的响应
您需要在双因素身份验证成功完成并且用户现在已完全身份验证时返回响应。为它实现另一个成功处理程序:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
<?php名称空间应用程序\安全;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\安全\Http\身份验证\AuthenticationSuccessHandlerInterface;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\TokenInterface;类TwoFactorAuthenticationSuccessHandler实现了AuthenticationSuccessHandlerInterface{公共函数onAuthenticationSuccess(请求$请求, TokenInterface$令牌):响应{//返回响应,告诉客户端认证包含双因素//验证现在完成。返回新响应('{"login": "success", "2fa_complete": true}');}}
将其注册为服务并将其配置为success_handler
的two_factor
验证方法:
1 2 3 4 5 6
#配置/包/ security.yaml安全:防火墙:your_firewall_name:two_factor:success_handler:your_api_2fa_success_handler
4)双因素认证失败时的响应
当尝试了双因素身份验证,但由于某种原因身份验证失败时,需要返回一个响应。为它实现一个失败处理程序:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
<?php名称空间应用程序\安全;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\安全\核心\异常\AuthenticationException;使用ob娱乐下载\组件\安全\Http\身份验证\AuthenticationFailureHandlerInterface;类TwoFactorAuthenticationFailureHandler实现了AuthenticationFailureHandlerInterface{公共函数onAuthenticationFailure(请求$请求, AuthenticationException$异常):哦?响应{//返回告诉客户端2fa失败的响应你可能需要补充更多细节//从$异常。返回新响应('{"error": "2fa_failed", "2fa_complete": false}');}}
将其注册为服务并将其配置为failure_handler
的two_factor
验证方法:
1 2 3 4 5 6
#配置/包/ security.yaml安全:防火墙:your_firewall_name:two_factor:failure_handler:your_api_2fa_failure_handler
发送2fa代码
POST数据
在API用例中,您通常会将双因素身份验证代码发送到防火墙设置中配置的“2fa check”路径。代码以相同的方式发送,就像你从2fa form - a发送一样帖子
请求在有效载荷中提交数据。
默认的POST参数名称为_auth_code
,不过可以在防火墙配置中自定义:
1 2 3 4 5 6 7
#配置/包/ security.yaml安全:防火墙:your_firewall_name:#……two_factor:auth_code_parameter_name:_auth_code双因素认证码的参数名称
JSON数据
为了更好地与json风格的api集成,bundle还接受帖子
请求的JSON有效负载。确保发送带有JSON内容类型的JSON编码有效负载,例如application / json
.
例如,如果你想使用以下类型的有效负载:
1
{“数据”: {“验证码”:“1234”}}
你必须告诉bundle,认证代码位于验证码
物业内数据
.所以在防火墙配置上,你必须设置如下:
1 2 3 4 5 6 7
#配置/包/ security.yaml安全:防火墙:your_firewall_name:#……two_factor:auth_code_parameter_name:data.authCode
如您所见,它是可以使用的ob娱乐下载symfony /属性访问定义参数名的符号,允许从复杂的数据结构中读取数据。
请注意,因为您正在处理JSON对象,你必须用点.
用于访问对象属性的符号。对于上面的例子,data.authCode
是正确的属性路径。数组式表示法数据(验证码)
不工作。