首页 文章

Basic Auth和JWT

提问于
浏览
5

我目前正在运行一个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 文件只是 user:encryptedpassword 并且很好 .

使用此配置,当我转到我的IP时:

  • 问我用户和密码

  • 开始加载页面

  • (有时)再次询问用户和密码

  • 完成加载页面

到目前为止这么好,即使它问了两次密码 .

Node.js应用程序具有JWT身份验证,当我登录时,网站重新加载,并且从这里开始,它会无限期地询问用户和密码(基本身份验证),只要我点击登录即可 . JWT在我的本地存储中 . 如果我在基本身份验证提示上单击取消,则JWT将被删除,我已注销,并且......再次询问基本身份验证 .

这是在Chrome上 . 使用Firefox和Safari,在JWT日志记录之后,它会自动从本地存储中删除令牌(并且我已经注销) .

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

1 回答

  • 6

    当我意识到问题是Basic Auth和JWT之间的问题时(正如@Curious在推荐中所建议的那样),并且他们都使用了 Authorization 标头,解决方案非常简单 .

    我将前端应用程序配置为通过自定义标头 **JWTAuthorization** 发送JWToken,因此当请求到达服务器时,它包含两个标头 AuthorizationJWTAuthorization . 然后它非常简单,在基本身份验证通过后,我只是 replace the headers (这里是Node.js应用程序,基于Koa):

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

相关问题