微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

node.js – 基本身份验证和JWT

我目前正在运行一个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.

解决方法:

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐