简体   繁体   English

用户注册时使用Symfony 3 JWT身份验证

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM