[英]Symfony 3 JWT authentication on user registration
I am working on an API in symfony that uses JWT for authentication. 我正在开发使用JWT进行身份验证的symfony中的API。 For JWT i use LexikJWTAuthenticationBundle and for token refreshment i use JWTRefreshTokenBundle. 对于JWT,我使用LexikJWTAuthenticationBundle;对于令牌刷新,我使用JWTRefreshTokenBundle。 What i want to do is to authenticate user via token and give it refresh token. 我想要做的是通过令牌对用户进行身份验证,并为其提供刷新令牌。 In security i have: 在安全方面,我有:
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login:
pattern: ^/api/login_check
stateless: true
anonymous: true
form_login:
check_path: fos_user_security_check
username_parameter: username
password_parameter: password
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
require_previous_session: false
register:
pattern: ^/api/register
anonymous: true
stateless: true
refresh:
pattern: ^/api/token/refresh
stateless: true
anonymous: true
api:
pattern: ^/api
provider: fos_userbundle
stateless: true
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
And inside my registration action i have: 在我的注册动作中,我有:
/**
* @Route("/api/register")
* @Method({"POST"})
*/
public function registerAction(Request $request)
{
$userManager = $this->get('fos_user.user_manager');
$data = $request->request->all();
$mailValidator = $this->get('validator.email');
$mailValidator->validate($data['email']);
$user = $userManager->createUser();
$user->setUsername($data['username']);
$user->setPlainPassword($data['password']);
$user->setEmail($data['email']);
$user->setEnabled(true);
$userManager->updateUser($user);
return $this->generateToken($user, 201);
}
protected function generateToken(User $user, $statusCode = 200)
{
$token = $this->get('lexik_jwt_authentication.jwt_manager')->create($user);
$response = array(
'token' => $token,
'refreshToken' => null,
'username' => $user->getUsername(),
'mail' => $user->getEmail(),
);
return new JsonResponse($response, $statusCode);
}
Inside generate action method i can create token from user entity, but i can't manage to create refresh token also. 在内部生成操作方法中,我可以从用户实体创建令牌,但是我也无法创建刷新令牌。 For provider i use FOSUserBundle, and it's login_check controller. 对于提供程序,我使用FOSUserBundle,它是login_check控制器。 I've tried to send post request to that controller from generateToken method, but didn't succeed. 我试图从generateToken方法向该控制器发送发布请求,但未成功。 Any help would be appreciated. 任何帮助,将不胜感激。
I don't know if you solved it but the refresh token will be generated after successful login. 我不知道您是否解决了问题,但刷新令牌将在成功登录后生成。 So you do not need to generate a refresh token when registration. 因此,注册时无需生成刷新令牌。 This is my code : 这是我的代码:
Security.yml: Security.yml:
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
login:
pattern: ^/login_check
stateless: true
anonymous: true
form_login:
check_path: fos_user_security_check
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
require_previous_session: false
register:
pattern: ^/register
anonymous: true
stateless: true
refresh:
pattern: ^/token/refresh
stateless: true
anonymous: true
api:
pattern: ^/
provider: fos_userbundle
stateless: true
guard:
authenticators:
- 'token_authenticator'
access_control:
- { path: ^/token/refresh, roles: IS_AUTHENTICATED_ANONYMOUSLY }
Service.yml: Service.yml:
services:
token_authenticator:
class: UserBundle\Security\TokenAuthenticator
arguments: ['@lexik_jwt_authentication.encoder', '@doctrine.orm.entity_manager']
config.yml: config.yml:
lexik_jwt_authentication:
private_key_path: '%jwt_private_key_path%'
public_key_path: '%jwt_public_key_path%'
pass_phrase: '%jwt_key_pass_phrase%'
token_ttl: '%jwt_token_ttl%'
gesdinet_jwt_refresh_token:
user_provider: fos_user.user_provider.username_email
ttl: 2592000
ttl_update: true
firewall: api
Run in terminal: 在终端中运行:
curl -X POST http://demowebsite.com/login_check -d username=USERNAME -d password=PASSWORD
This wil generate a token and refresh token. 这将生成令牌并刷新令牌。 The refresh token will be stored in your DB table refresh_token 刷新令牌将存储在您的数据库表refresh_token中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.