6

RESTful API に LexikJWTBundle を使用しています。

ログインは正常に機能し、トークンを取得します。しかし、GET リクエストを行うと、コンテンツのない 401 が返されます。プロファイラーでこれを取得するため、認証ヘッダーは問題ないようです: Request Headers: authorization: Bearer {token} Request Server Parameters: HTTP_AUTHORIZATION: Bearer {token}

私が取得する 401 は、https ://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Security/Firewall/JWTListener.php#L80 からのものです。

さまざまな解決策を試しましたが、それでもうまくいきません。

これを解決/デバッグする方法について何か考えはありますか?

私の設定:

# config.yml
...

lexik_jwt_authentication:
    private_key_path: %kernel.root_dir%/var/jwt/private.pem   # ssh private key path
    public_key_path:  %kernel.root_dir%/var/jwt/public.pem    # ssh public key path
    pass_phrase:      'TEST'                                      # ssh key pass phrase
    token_ttl:        86400                                   # token ttl - defaults to 86400

# security.yml

security:
role_hierarchy:
    ROLE_SUPER_ADMIN:       [ROLE_ADMIN, ROLE_SONATA_ADMIN, ROLE_ALLOWED_TO_SWITCH]
# http://sonata-project.org/bundles/admin/2-3/doc/reference/security.html
# set access_strategy to unanimous, else you may have unexpected behaviors
access_decision_manager:
    strategy: unanimous

encoders:
    FOS\UserBundle\Model\UserInterface: sha512

providers:
    fos_userbundle:
        id: fos_user.user_provider.username_email

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false

    api_login:
        pattern: ^/api/login # Default: .*
        provider: fos_userbundle

        # form login
        form_login:
            login_path:     fos_user_security_login
            # csrf_provider: form.csrf_provider # Default: my.csrf_provider.id
            # LexikJWT # 09/01/15 - Note: provient de la configuration officielle.
            check_path:     api_login_check
            success_handler:          lexik_jwt_authentication.handler.authentication_success
            failure_handler:          lexik_jwt_authentication.handler.authentication_failure
            require_previous_session: false 
        anonymous: true # Default: ~

    api:
        pattern:   ^/api
        stateless: true
        lexik_jwt:
            authorization_header: # check token in Authorization Header
                enabled: true
                prefix:  Bearer
        anonymous: true

access_control:
    # Secured part of the site
    # This config requires being logged for the whole site and having the admin role for the admin part.
    # Change these rules to adapt them to your needs
    - { path: "^/api/contacts$", roles: IS_AUTHENTICATED_ANONYMOUSLY, methods: [POST] }
    - { path: "^/api/users/dt$", roles: IS_AUTHENTICATED_ANONYMOUSLY, methods: [GET] }
    - { path: "^/api/users$", roles: IS_AUTHENTICATED_ANONYMOUSLY, methods: [POST] }
    - { path: "^/api",       roles: [IS_AUTHENTICATED_FULLY, ROLE_API] }
4

3 に答える 3

2

security.ymlROLE_APIの にを追加する必要があります。role_hierarchy

role_hierarchy:
    # ...
    ROLE_API: [ROLE_USER]

そして、 ランク付けされたユーザーは、 にROLE_API制限されたルートにアクセスできますIS_AUTHENTICATED_FULLY

また、Web サーバーを使用している場合は、組み込みサーバー (つまりapp/console server:run) を使用してアプリケーションを使用してみてください。

Apache はヘッダーのトークンを変更しているようです。

于 2016-02-12T17:49:24.067 に答える