基本身份验证和 JWT
Basic Auth and 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 日志记录后,它会自动从本地存储中删除令牌(我已注销)。
这很难解释,我无法向您展示该网站。简而言之,主要问题是 JWT(node.js 应用程序的)被删除了。
当我意识到问题是 Basic Auth 和 JWT 之间的冲突(正如@Curious 在推荐中建议的那样),并且他们都在使用 Authorization
header,解决方法很简单。
我将我的前端应用程序配置为通过自定义 header、**JWTAuthorization**
发送 JWToken,因此当请求到达服务器时,它同时包含 headers Authorization
& JWTAuthorization
。然后就很简单了,基本认证通过后,我就替换headers(这里是Node.js应用,基于Koa):
app.use(function *(next) {
this.headers.authorization = this.headers.jwtauthorization;
yield next;
});
我目前是 运行 一个 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 日志记录后,它会自动从本地存储中删除令牌(我已注销)。
这很难解释,我无法向您展示该网站。简而言之,主要问题是 JWT(node.js 应用程序的)被删除了。
当我意识到问题是 Basic Auth 和 JWT 之间的冲突(正如@Curious 在推荐中建议的那样),并且他们都在使用 Authorization
header,解决方法很简单。
我将我的前端应用程序配置为通过自定义 header、**JWTAuthorization**
发送 JWToken,因此当请求到达服务器时,它同时包含 headers Authorization
& JWTAuthorization
。然后就很简单了,基本认证通过后,我就替换headers(这里是Node.js应用,基于Koa):
app.use(function *(next) {
this.headers.authorization = this.headers.jwtauthorization;
yield next;
});