2016-01-19 141 views
5

我目前正在运行一个Node.js应用程序,并提供API和文件服务(我知道nginx可以处理它,但我不应该首先使用它)。基本身份验证和JWT

我只是简单地使用它来获得一个简单的基本认证,这并不是那么简单。

这里是我的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日志记录之后,它会自动从本地存储中删除令牌(并且我已注销)。

这是很难解释,我不能告诉你的网站。总之,主要的问题是JWT(node.js应用程序)被删除。

+0

我不知道这是可能的混合基本认证和智威汤逊。我可能是错的,但据我所知,这两种方法都使用'Authorization'请求标题,所以它们不会让人感到意外。 – Curious

+0

是的,经过一番研究,我确认它可能是问题 – Cohars

+0

不要以为我可以找到任何修复。 – Cohars

回答

4

当我意识到这个问题是基本认证和智威汤逊之间的冲突(如@Curious在表彰的建议),他们使用的是Authorization头两者的解决方案是很容易的。

配置我的前端应用程序通过自定义标题,**JWTAuthorization**送JWToken,所以当请求到达服务器,它包含的两个头Authorization & JWTAuthorization。然后,它是相当简单,基本身份验证通过后,我只是更换头(这里的Node.js应用程式的基础上,兴亚):

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