数据定制和验证
编辑本页数据定制和验证
小心:在添加自己的自定义数据之前,请先了解JWT有效载荷没有加密,它只是base64编码.令牌签名确保了它的完整性(意味着它不能被修改),但是任何人都可以读取它的内容(尝试使用简单的工具,如https://jwt.io/).
向JWT添加自定义数据或标头
使用事件::JWT_CREATED
默认情况下,JWT有效负载将包含用户名、用户角色、令牌创建日期和过期日期,但您可以添加自己的数据。
您还可以修改标头以适应您的应用程序上下文。
1 2 3 4 5 6 7
#配置/ services.yaml服务:acme_api.event.jwt_created_listener:类:App \ EventListener \ JWTCreatedListener参数:[“@request_stack”]标签:-{名称:kernel.event_listener,事件:lexik_jwt_authentication.on_jwt_created,方法:onJWTCreated}
示例:将客户端IP地址添加到编码的有效负载中
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/ / src / App / EventListener / JWTCreatedListener.php使用Lexik\包\JWTAuthenticationBundle\事件\JWTCreatedEvent;使用ob娱乐下载\组件\HttpFoundation\RequestStack;/ * * *@varRequestStack * /私人$requestStack;/ * * *@paramRequestStack $ RequestStack */公共函数__construct(RequestStack$requestStack){$这->requestStack =$requestStack;}/ * * *@paramJWTCreatedEvent $event * *@returnvoid * /公共函数onJWTCreated(JWTCreatedEvent$事件){$请求=$这->requestStack->getCurrentRequest ();$有效载荷=$事件->getData ();$有效载荷[“知识产权”] =$请求->getClientIp ();$事件->setData ($有效载荷);$头=$事件->getHeader ();$头[“哭”] =智威汤逊的;$事件->setHeader ($头);}
示例:重写令牌过期日期计算以更加灵活
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src / App / EventListener / JWTCreatedListener.php使用Lexik\包\JWTAuthenticationBundle\事件\JWTCreatedEvent;/ * * *@paramJWTCreatedEvent $event * *@returnvoid * /公共函数onJWTCreated(JWTCreatedEvent$事件){$过期=新\ DateTime (“+ 1天”);$过期->凝固时间(2,0,0);$有效载荷=$事件->getData ();$有效载荷[“经验”] =$过期->getTimestamp ();$事件->setData ($有效载荷);}
在JWT创建时使用自定义有效负载
如果你以编程方式创建JWT令牌,您可以使用该方法向JWT添加自定义数据createFromPayload(UserInterface $user, array $payload)
1 2 3
$有效载荷= (“foo”= >“酒吧”];$jwt=$这->容器->get (“lexik_jwt_authentication.jwt_manager”)->createFromPayload ($用户,$有效载荷);
JWT_DECODED -验证JWT负载中的数据
一旦jwt有效负载被解码,您就可以访问它以执行您自己的额外验证。
1 2 3 4 5 6 7
#配置/ services.yaml服务:acme_api.event.jwt_decoded_listener:类:App \ EventListener \ JWTDecodedListener参数:[“@request_stack”]标签:-{名称:kernel.event_listener,事件:lexik_jwt_authentication.on_jwt_decoded,方法:onJWTDecoded}
示例:检查客户端ip解码的有效负载(来自示例1)
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src / App / EventListener / JWTDecodedListener.php使用Lexik\包\JWTAuthenticationBundle\事件\JWTDecodedEvent;/ * * *@paramJWTDecodedEvent $event * *@returnvoid * /公共函数onJWTDecoded(JWTDecodedEvent$事件){$请求=$这->requestStack->getCurrentRequest ();$有效载荷=$事件->getPayload ();如果(!收取($有效载荷[“知识产权”) | |$有效载荷[“知识产权”] ! = =$请求->getClientIp ()) {$事件->markAsInvalid ();}}
示例:添加额外的数据到有效载荷-使其在您的自定义UserProvider
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src / App / EventListener / JWTDecodedListener.php使用Lexik\包\JWTAuthenticationBundle\事件\JWTDecodedEvent;/ * * *@paramJWTDecodedEvent $event * *@returnvoid * /公共函数onJWTDecoded(JWTDecodedEvent$事件){$有效载荷=$事件->getPayload ();$用户=$这->userRepository->findOneByUsername ($有效载荷[“用户名”]);$有效载荷[“custom_user_data”] =$用户->getCustomUserInformations ();$事件->setPayload ($有效载荷);//不要忘记给下一个事件/步骤的有效负载}
JWT_AUTHENTICATED -自定义您的安全令牌
通过身份验证后,您可以向令牌添加属性,以允许应用程序使用JWT属性。
1 2 3 4 5 6
#配置/ services.yaml服务:acme_api.event.jwt_authenticated_listener:类:App \ EventListener \ JWTAuthenticatedListener标签:-{名称:kernel.event_listener,事件:lexik_jwt_authentication.on_jwt_authenticated,方法:onJWTAuthenticated}
示例:在经过身份验证的令牌中保留设置到JWT中的UUID
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / App / EventListener / JWTAuthenticatedListener.php使用Lexik\包\JWTAuthenticationBundle\事件\JWTAuthenticatedEvent;/ * * *@paramJWTAuthenticatedEvent $event * *@returnvoid * /公共函数onJWTAuthenticated(JWTAuthenticatedEvent$事件){$令牌=$事件->getToken ();$有效载荷=$事件->getPayload ();$令牌->setAttribute (“uuid”,$有效载荷[“uuid”]);}
AUTHENTICATION_SUCCESS -向JWT响应中添加公共数据
默认情况下,身份验证响应只是一个包含JWT的json,但您可以向其中添加自己的公共数据。
1 2 3 4 5 6
#配置/ services.yaml服务:acme_api.event.authentication_success_listener:类:App \ EventListener \ AuthenticationSuccessListener标签:-{名称:kernel.event_listener,事件:lexik_jwt_authentication.on_authentication_success,方法:onAuthenticationSuccessResponse}
示例:在响应体中添加用户角色
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
/ / src / App / EventListener / AuthenticationSuccessListener.php使用Lexik\包\JWTAuthenticationBundle\事件\AuthenticationSuccessEvent;/ * * *@paramAuthenticationSuccessEvent $event */公共函数onAuthenticationSuccessResponse(AuthenticationSuccessEvent$事件){$数据=$事件->getData ();$用户=$事件->getUser ();如果(!$用户运算符用户界面){返回;}$数据[“数据”] =数组(“角色”= >$用户->将getRoles ());$事件->setData ($数据);}
JWT_ENCODED -获得编码后的JWT令牌字符串
在JWT创建后,您可能需要得到它。
示例:获取JWT字符串
1 2 3 4 5 6 7 8 9 10
/ / src / App / EventListener / JWTEncodedListener.php使用Lexik\包\JWTAuthenticationBundle\事件\JWTEncodedEvent;/ * * *@paramJWTEncodedEvent $event */公共函数onJwtEncoded(JWTEncodedEvent$事件){$令牌=$事件->getJWTString ();}
Events::AUTHENTICATION_FAILURE -自定义失败响应体
默认情况下,身份验证失败时的响应只是一个包含失败消息和401状态代码的json,但您可以设置自定义响应。
1 2 3 4 5 6
#配置/ services.yaml服务:acme_api.event.authentication_failure_listener:类:App \ EventListener \ AuthenticationFailureListener标签:-{名称:kernel.event_listener,事件:lexik_jwt_authentication.on_authentication_failure,方法:onAuthenticationFailureResponse}
示例:设置鉴权失败的自定义响应
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src / App / EventListener / AuthenticationFailureListener.php使用Lexik\包\JWTAuthenticationBundle\事件\AuthenticationFailureEvent;使用Lexik\包\JWTAuthenticationBundle\响应\JWTAuthenticationFailureResponse;使用ob娱乐下载\组件\HttpFoundation\JsonResponse;/ * * *@paramAuthenticationFailureEvent $event */公共函数onAuthenticationFailureResponse(AuthenticationFailureEvent$事件){$数据= (“名字”= >“John Doe”,“foo”= >“酒吧”,);$响应=新JWTAuthenticationFailureResponse (“错误的凭据,请检查您的用户名/密码是否设置正确”, JsonResponse::HTTP_UNAUTHORIZED);$响应->setData ($数据);$事件->setResponse ($响应);}
JWT_INVALID -自定义无效的令牌响应
默认情况下,如果令牌无效,则响应只是一个包含相应错误消息和401状态代码的json,但您可以设置自定义响应。
1 2 3 4 5 6
#配置/ services.yaml服务:acme_api.event.jwt_invalid_listener:类:App \ EventListener \ JWTInvalidListener标签:-{名称:kernel.event_listener,事件:lexik_jwt_authentication.on_jwt_invalid,方法:onJWTInvalid}
示例:在无效令牌上设置自定义响应消息和状态码
12 3 4 5 6 7 8 9 10 11 12 13
/ / src / App / EventListener / JWTInvalidListener.php使用Lexik\包\JWTAuthenticationBundle\事件\JWTInvalidEvent;使用Lexik\包\JWTAuthenticationBundle\响应\JWTAuthenticationFailureResponse;/ * * *@paramJWTInvalidEvent $event */公共函数onJWTInvalid(JWTInvalidEvent$事件){$响应=新JWTAuthenticationFailureResponse (“您的代币无效,请重新登录以获取新的代币”,403);$事件->setResponse ($响应);}
JWT_NOT_FOUND -自定义对标记未找到的响应
默认情况下,如果在请求中没有找到令牌,身份验证侦听器将调用返回未经授权的(401)json响应的入口点,或者(如果防火墙允许匿名请求)让请求继续进行。
由于这个事件,您可以设置自定义响应。
1 2 3 4 5 6
#配置/ services.yaml服务:acme_api.event.jwt_notfound_listener:类:App \ EventListener \ JWTNotFoundListener标签:-{名称:kernel.event_listener,事件:lexik_jwt_authentication.on_jwt_not_found,方法:onJWTNotFound}
示例:在未找到令牌上设置自定义响应消息
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src / App / EventListener / JWTNotFoundListener.php使用Lexik\包\JWTAuthenticationBundle\事件\JWTNotFoundEvent;使用ob娱乐下载\组件\HttpFoundation\JsonResponse;/ * * *@paramJWTNotFoundEvent $event */公共函数onJWTNotFound(JWTNotFoundEvent$事件){$数据= (“状态”= >403年被禁止的,“消息”= >“失踪的令牌”,);$响应=新JsonResponse ($数据,403);$事件->setResponse ($响应);}
JWT_EXPIRED -自定义对过期令牌的响应消息
默认情况下,如果请求中提供的令牌过期,身份验证侦听器将调用入口点,返回未经授权的(401)json响应。由于这个事件,您可以设置自定义响应或简单地更改响应消息。
1 2 3 4 5 6
#配置/ services.yaml服务:acme_api.event.jwt_expired_listener:类:App \ EventListener \ JWTExpiredListener标签:-{名称:kernel.event_listener,事件:lexik_jwt_authentication.on_jwt_expired,方法:onJWTExpired}
示例:自定义token过期时的响应
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / App / EventListener / JWTExpiredListener.php使用Lexik\包\JWTAuthenticationBundle\事件\JWTExpiredEvent;使用Lexik\包\JWTAuthenticationBundle\响应\JWTAuthenticationFailureResponse;/ * * *@paramJWTExpiredEvent $event */公共函数onJWTExpired(JWTExpiredEvent$事件){/**@varJWTAuthenticationFailureResponse * /$响应=$事件->getResponse ();$响应->setMessage (您的代币过期了,请续借。);}
Protip:您可能希望使用相同的方法来定制两者上的响应JWT_INVALID
,JWT_NOT_FOUND
和/或JWT_EXPIRED
事件。为此,使用Lexik
接口,以输入监听器方法的事件参数,而不是与这些特定事件之一对应的具体类。