基本身份验证和JWT

7

我目前正在运行一个Node.js应用程序,它具有API和文件服务功能(我知道nginx可以处理它,但我最初不应该使用它)。

我只是使用它来进行简单的基本身份验证,但这并不那么简单。

以下是我的nginx配置:

  upstream nodejsapp {
    server 127.0.0.1:1337;
    keepalive 15;
  }

  server {
    listen 80 default_server;

    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_redirect off;

    location / {
      proxy_pass http://nodejsapp;

      proxy_set_header Connection "Keep-Alive";
      proxy_set_header Proxy-Connection "Keep-Alive";
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;
    }
  }

/etc/nginx/.htpasswd文件仅仅是用户:加密密码,很好。

使用这个配置,当我访问我的IP地址时,它:

  • 要求我输入用户名和密码
  • 开始加载页面
  • 有时会再次要求输入用户名和密码
  • 完成加载页面

目前为止一切正常,即使它两次要求输入密码。

Node.js应用程序采用JWT身份验证。当我登录后,网站重新加载并从此处开始,无限制地要求输入用户名和密码(基本认证),只要我点击登录。JWT在我的本地存储中。如果我在基本认证提示框上点击取消,则JWT将被删除,我将退出登录,并且...再次要求进行基本认证。

这是在Chrome上的情况。对于Firefox和Safari,在JWT登录后,它会自动从本地存储中删除令牌(我退出登录)。

很难解释,我无法向您展示网站。简而言之,主要问题是Node.js应用程序的JWT被删除了。


我不确定是否可以混合使用基本身份验证和JWT。我可能错了,但据我所知,这两种方法都使用“Authorization”请求头,因此它们之间的冲突并不令人意外。 - Oleg
是的,在进行了一些研究后,我确认这可能是问题。 - Cohars
我觉得我找不到任何解决办法。 - Cohars
1个回答

11

当我意识到问题是Basic Auth和JWT之间的冲突(正如@Curious在评论中建议的那样),并且它们都使用Authorization头时,解决方案变得非常简单。

我配置我的前端应用程序通过自定义头部JWTAuthorization发送JWToken,因此当请求到达服务器时,它包含两个头部AuthorizationJWTAuthorization。然后很简单,在基本身份验证通过后,我只需替换这些头部(在这里是基于Koa的Node.js应用程序):

app.use(function *(next) {
  this.headers.authorization = this.headers.jwtauthorization;
  yield next;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接