LexikJWTAuthenticationBundle在匿名路由上返回401无效令牌

时间:2016-02-12 15:20:11

标签: symfony fosuserbundle jwt

我将这个LexikJWTAuthenticationBundle与FosUserBundle一起使用。

我在security.yml中有这个:

firewalls:
    app:
        pattern: ^/api
        stateless: true
        anonymous: true
        lexik_jwt: ~

使用以下access_control:

- { path: ^/api/user/action1, roles: IS_AUTHENTICATED_FULLY }
- { path: ^/api/user/action2, roles: IS_AUTHENTICATED_ANONYMOUSLY }

无论请求标头内部是什么,我期望/ api / user / action2的行为都具有访问权限。但是,在授权承载设置但无效的情况下我获得401(可以使用有效令牌或根本没有授权承载)。

我的用例是我需要在我的控制器中检查用户是否已登录但如果没有,我仍然希望让该匿名用户访问该路由。

2 个答案:

答案 0 :(得分:1)

您必须为要允许匿名用户的路由/模式创建特定防火墙:

action2:
    pattern: ^/api/user/action2
    anonymous: true
    lexik_jwt: ~

然后,只需在完全受保护之前移动受保护较少的access_control

- { path: ^/api/user/action2, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api/user/action1, roles: IS_AUTHENTICATED_FULLY }

通过这种方式,您的应用程序并不关心Authorization标头,并且所有用户都可以在没有JWT的情况下访问该资源。

<强>更新

将匿名路由的防火墙更改为:

action2:
    pattern: ^/api/user/action2
    anonymous: true
    lexik_jwt: ~

并使access_control接受匿名且经过完全身份验证的用户:

- { path: ^/api/user/action2, roles: [IS_AUTHENTICATED_ANONYMOUSLY, IS_AUTHENTICATED_FULLY]  }
- { path: ^/api/user/action1, roles: IS_AUTHENTICATED_FULLY }

请使用相同的订单并正确清除缓存。

它在我的JWT / FOSUB应用程序中运行良好,如果它不适合你,我会给你一个现成的工作示例。

控制器:

$currentToken = $this->get('security.token_storage')->getToken();

if (is_object($currentToken->getUser())) {
    // Do your logic with the current user
    return new JsonResponse(['user' => $currentToken->getUser()->getUsername()]);
} else {
    return new JsonResponse(['user' => 'Anonymous']);
}

希望它适合你。

答案 1 :(得分:0)

我以这种方式解决了你的问题:

    api_public:
        pattern: ^/api/v1/public
        anonymous: true
        lexik_jwt:
            authorization_header:
                enabled: false
                prefix:  Bearer
            query_parameter:
                enabled: false
                name:    bearer
    api:
        pattern:   ^/api
        stateless: true
        anonymous: true
        lexik_jwt:
            authorization_header:
                enabled: true
                prefix:  Bearer
            query_parameter:
                enabled: true
                name:    bearer