未找到 Lexik JWT 令牌

Posted

技术标签:

【中文标题】未找到 Lexik JWT 令牌【英文标题】:Lexik JWT Token not found 【发布时间】:2016-05-17 21:50:24 【问题描述】:

我看到过类似的问题,但仍然无法解决问题。

我是 Symfony 的新手,我正在使用 Lexik JWT 捆绑包和 symfony3 进行 API 身份验证,并使用登录表单进行 Web 身份验证。

我得到了令牌,但是当我尝试使用它时,我得到 401 - Bad authentication。 我读过它可能是一个 apache 问题,所以我正在尝试使用 php 的内置 Web 服务器,但仍然没有运气。

这是我的 security.yml 文件:

security:

encoders:
    AppBundle\Entity\User:
        algorithm: bcrypt

# http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
providers:
    in_memory:
        memory: ~
    our_db_provider:
        entity:
            class: AppBundle:User
            property: username

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
        stateless: true
        anonymous: true
        form_login:
            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
        provider: our_db_provider

    api:
        pattern:   ^/api
        stateless: true
        provider: our_db_provider
        lexik_jwt:
          authorization_header: # check token in Authorization Header
            enabled: true
            prefix:  Bearer
          throw_exceptions:        true     # When an authentication failure occurs, return a 401 response immediately
          create_entry_point:      true      # When no authentication details are provided, create a default entry point that returns a 401 response


    main:
        anonymous: ~
        form_login:
          login_path: /login
          check_path: /login_check
        provider: our_db_provider

access_control:
  -  path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY 
  -  path: ^/api,       roles: IS_AUTHENTICATED_FULLY 
  -  path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY 
  -  path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY 
  -  path: ^/, roles: [ROLE_ADMIN, ROLE_USER] 

如果我在我的 api 防火墙中将 create_entry_point 设置为 false,我会收到 500 错误:在 TokenStorage 中找不到令牌。

也许我以错误的方式传递令牌?我尝试了几种方法,因为我不确定哪一种是正确的。这是我的标题:

POST /api/notifications HTTP/1.1
Host: localhost:8000
Authorization: bearer "token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJleHAiOjE0NTUwMDk1ODAsInVzZXJuYW1lIjoiYXNvcmlhIiwiaWF0IjoiMTQ1NDkyMzE4MCJ9.rwgAkLBesTYOZn3B96Jlsf9_3Qy-rjrRt2l5UxdXD8ZadJ2YbK-9m7qNqUd9-bhaA_MFL1lssPZ-0AzmQCZx8bL8XD_l2_df0wfVm6Le6pEJEJk0arbyxlEOZ-9LrRdOa6EjnzDcZT6Wn76QNOsCSjME7rjk0w0lLs4eXAaXGAYL6lqU4YoiM1xnifzHgGtJKc7RBBivY8yHjfs51S6GwEKzPGrYMUTZWmjhxFPlKZCqEJlaJ6NT82A3PuoISCMUvt7AuxhHdgeuS-TMjdTY-WhqaL7f7Z2FP0_FstKVORHDzC1vf7VlylF76SnF0Sh2tMTuvf70zYnD_gF0k7b9zoOp54e0mJt0XaLTyCtomPSeDhfJV1wJY6EZsrvdUrrHXXtXhA6K70FIM_nQJPVo4Raht-hQWmOnWb3Ib0SvvytQHP96klXVgKHyIaicEjvWhmonzgSRndme4HGXlPWmbKH6tVJpvWatOeaWD4jjS-ZLD_5oBr_o3vNPw81oZj0huI6OgzYvXDpLPw3P7Ma4LmBdQOLwpUEPG3LnuKIdU27umFTrN3T-Cfrb6kITU1BTaTL-AIOM-F6FDlcgJfYxOs6GEFOlFtjJ5KSAEiY8DWiubbrS-VH9uaMlc9YapTlNVsUI7whzO7QmXzC-V8idrNoWBWVftyMDlA9YR_D7N9E"
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

或者

    POST /api/notifications HTTP/1.1
Host: localhost:8000
Authorization: bearer "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJleHAiOjE0NTUwMDk1ODAsInVzZXJuYW1lIjoiYXNvcmlhIiwiaWF0IjoiMTQ1NDkyMzE4MCJ9.rwgAkLBesTYOZn3B96Jlsf9_3Qy-rjrRt2l5UxdXD8ZadJ2YbK-9m7qNqUd9-bhaA_MFL1lssPZ-0AzmQCZx8bL8XD_l2_df0wfVm6Le6pEJEJk0arbyxlEOZ-9LrRdOa6EjnzDcZT6Wn76QNOsCSjME7rjk0w0lLs4eXAaXGAYL6lqU4YoiM1xnifzHgGtJKc7RBBivY8yHjfs51S6GwEKzPGrYMUTZWmjhxFPlKZCqEJlaJ6NT82A3PuoISCMUvt7AuxhHdgeuS-TMjdTY-WhqaL7f7Z2FP0_FstKVORHDzC1vf7VlylF76SnF0Sh2tMTuvf70zYnD_gF0k7b9zoOp54e0mJt0XaLTyCtomPSeDhfJV1wJY6EZsrvdUrrHXXtXhA6K70FIM_nQJPVo4Raht-hQWmOnWb3Ib0SvvytQHP96klXVgKHyIaicEjvWhmonzgSRndme4HGXlPWmbKH6tVJpvWatOeaWD4jjS-ZLD_5oBr_o3vNPw81oZj0huI6OgzYvXDpLPw3P7Ma4LmBdQOLwpUEPG3LnuKIdU27umFTrN3T-Cfrb6kITU1BTaTL-AIOM-F6FDlcgJfYxOs6GEFOlFtjJ5KSAEiY8DWiubbrS-VH9uaMlc9YapTlNVsUI7whzO7QmXzC-V8idrNoWBWVftyMDlA9YR_D7N9E"
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

有什么想法吗?

提前致谢!

【问题讨论】:

【参考方案1】:

授权头应该是

Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9....9YR_D7N9E

【讨论】:

是的,就是这样!问题似乎出在小写的“bearer”中,因为现在它可以使用和不使用大括号。我会发誓我一开始尝试使用大写 B,但我想当时我的配置有问题。太感谢了! ^^ 是的,如果你仔细阅读防火墙的配置,你会发现你可以更改它:将prefix: Bearer更改为prefix: Foo,你可以使用Authorization: Foo eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9....9YR_D7N9E传递你的令牌【参考方案2】:

第一个解决方案可以解决“401 - Bad authentication”错误。

但是对于 Apache 用户出现错误“401 - JWT Token not found”,解决方案是重写请求的 HTTP 授权标头,将以下说明放置在你的虚拟主机:

RewriteEngine On
RewriteCond %HTTP:Authorization ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

您可以在documentation、this post 和this one 上找到有关此问题的更多信息。

【讨论】:

在我的情况下, /web 目录中缺少 .htaccess。此外,重写条件可以添加到 .htaccess 我可以确认这些 apache 设置。我的错误是相似的。引发了 InsufficientAuthenticationException。我们的配置是在 nginx 负载均衡器、反向代理和 ssl 终止 vm 后面带有 apache 的 VM。我很确定,这些线路不在我们没有 nginx 网关的旧服务器上。【参考方案3】:

如果有人在完成上述所有操作后仍然遇到此问题,您可以尝试这样的事情。除了使用HTTP_AUTHORIZATION,您还可以使用自定义http 标头,例如Php-Auth-Digest。使用HTTP_AUTHORIZATION 可能会很棘手,并且由于各种不同的服务器设置(尤其是使用共享服务器环境、cPanel 等),可能会从请求中删除

在 LexikJWT Bundle 中接受自定义 http 标头的配置是这样的,

lexik_jwt_authentication:
    # token extraction settings
    token_extractors:
         # look for a token as Authorization Header
        authorization_header:
            enabled: true
            prefix: Bearer
            name: Php-Auth-Digest

要了解有关此的更多信息,请访问此链接 - https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Resources/doc/1-configuration-reference.md

从您的 api 应用程序发送标头看起来像这样(这是来自 Angular 6 的示例)

request = request.clone(
    setHeaders: 
      "Php-Auth-Digest": `Bearer $currentUser.token`,
    
  );

我希望这对某人有所帮助。干杯。

【讨论】:

以上是关于未找到 Lexik JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

尝试访问我的 api 平台时未找到 JWT 令牌 401 错误?

未找到授权令牌 - Express-JWT 和 Auth0

生成令牌 JWT

res.redirect 时未找到授权令牌

Micronaut 配置未发出 JWT 刷新令牌

当 jwt 刷新令牌未过期时,React Native 应用程序注销