Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fix "The key _username must be a string" error with JWT

Tags:

jwt

symfony

I have a website with a standard connection, and I want to add a new way to connect thanks to the API part.

I have followed this doc : 1https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Resources/doc/index.md#getting-started

So I add JWT bundle to my Symfony 3 project, and I changed my security.yml :

# app/config/security.yml

security:
  encoders:
    Symfony\Component\Security\Core\User\User: sha512
    GS\UserBundle\Entity\User: sha512 #sha512

  role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

  providers:
    main:
      entity:
        class:    GS\UserBundle\Entity\User
        property: login

  firewalls:
    dev:
      pattern: ^/(_(profiler|wdt)|css|images|js)/
      security: false
    main:
      pattern:   ^/
      anonymous: true
      provider: main
      stateless: true
      form_login:
        login_path: login
        check_path: login_check
        default_target_path: preLogin
      logout:
        path:        logout
        target:      preLogin
      remember_me:
         secret:     '%secret%' # se souvenir de moi
         lifetime: 1000
         always_remember_me: true
    login:
        pattern:  ^/api/login
        stateless: true
        anonymous: true
        provider: main
        json_login:
            check_path:               /api/login_check
            success_handler:          lexik_jwt_authentication.handler.authentication_success
            failure_handler:          lexik_jwt_authentication.handler.authentication_failure
    api:
        pattern:   ^/api
        stateless: true
        guard:
            authenticators:
                - lexik_jwt_authentication.jwt_token_authenticator
  access_control:
    - { path: /admin, roles: ROLE_ADMIN }
    - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api,       roles: IS_AUTHENTICATED_FULLY }

I have configured my config.yml like this :

lexik_jwt_authentication:
    secret_key:       '%kernel.project_dir%/config/jwt/private.pem'
    public_key:       '%kernel.project_dir%/config/jwt/public.pem'  
    user_identity_field: login
    pass_phrase:      'MY PASSWORD'
    token_ttl:        3600

And When I tried to obtain my token with postman like this : postman

I have this error :

The key "_username" must be a string, "NULL" given.

So, I tried to add "user_parameter" in the security.yml in order to give the parameters name of my user entity, like this :

 login:
        pattern:  ^/api/login
        stateless: true
        anonymous: true

        json_login:
            check_path:               /api/login_check
            username_parameter: login
            password_parameter: mdp
            success_handler:          lexik_jwt_authentication.handler.authentication_success
            failure_handler:          lexik_jwt_authentication.handler.authentication_failure

And now Postman answer me nothing.

EDIT:

I find a commande to check my config file and I have this answer :

commande

And if I remove the username_parameter and the password_parameter, the commande check tell me that the config is ok, but I have the same error with postman :

The key "username" must be a string, "NULL" given.

Help me please I don't find any solution...

like image 922
Nooby Avatar asked Dec 27 '25 16:12

Nooby


1 Answers

Lexik JWT authentication config needs the provider key in the security.yaml.

login:
        pattern:  ^/api/login
        stateless: true
        anonymous: true
        provider: YOUR_PRODIVER_NAME #in your case it's main
        json_login:
            check_path:               /api/login_check
            username_parameter: login
            password_parameter: mdp
            success_handler:          lexik_jwt_authentication.handler.authentication_success
            failure_handler:          lexik_jwt_authentication.handler.authentication_failure

Then to be able to verify the user informations, it needs to know what field is the identity field. So in the lexik_jwt_authentication.yaml:

lexik_jwt_authentication:
    secret_key: '%env(resolve:JWT_SECRET_KEY)%'
    public_key: '%env(resolve:JWT_PUBLIC_KEY)%'
    pass_phrase: '%env(JWT_PASSPHRASE)%'
    user_identity_field: YOUR_USER_FIELD # example email
    token_ttl: 7200

About the request parameters, username and password have to be passed (No _)

enter image description here

like image 152
balzacLeGeek Avatar answered Dec 31 '25 17:12

balzacLeGeek



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!