【问题标题】:Basic Auth and JWT基本身份验证和 JWT
【发布时间】:2016-01-22 22:44:57
【问题描述】:

我目前正在运行一个 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。我可能错了,但据我所知,这两种方法都使用Authorization 请求标头,所以它们相互冲突并不奇怪。
  • 是的,经过一些研究,我确认这可能是问题
  • 别以为我能找到任何解决办法。

标签: node.js authentication nginx basic-authentication jwt


【解决方案1】:

当我意识到问题在于 Basic Auth 和 JWT 之间的冲突(正如 @Curious 在推荐中所建议的那样),并且它们都使用 Authorization 标头时,解决方案相当容易。

我将前端应用程序配置为通过自定义标头**JWTAuthorization** 发送 JWToken,因此当请求到达服务器时,它包含两个标头 AuthorizationJWTAuthorization。然后就很简单了,基本的auth通过后,我就替换headers(这里是Node.js应用,基于Koa):

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

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 2011-01-28
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2021-07-29
    • 2021-01-28
    • 2016-08-23
    • 1970-01-01
    相关资源
    最近更新 更多