媒介
本文将会从最基本的一种web权限考证提及,即HTTP Basic authentication,然后是基于cookies和tokens的权限考证,末了则是signatures和一次性暗码。
HTTP Basic authentication
当客户端提议一个要求时,它能够运用HTTP Basic authentication来供应一个用户名和暗码,来举行权限考证。
由于它不依赖于cookies,sessions等任何外部要素,所以它是最简朴的权限考证要领。在运用它时,客户端须要在每次要求时,都附带上Authorization
要求头,用户名和暗码都不会被加密,然则须要被花样化为以下构造:
用户名和暗码由一个冒号衔接,如
username:password
这个字符串需举行Base64编码
Basic
关键字需被安排在这个编码后的字符串的前面
例子:
curl --header "Authorization: Basic am9objpzZWNyZXQ=" my-website.com
在Node.js
中完成它是异常简朴的,以下是一个经由过程Express
中间件来完成的例子:
import basicAuth from 'basic-auth';
function unauthorized(res) {
res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
return res.send(401);
};
export default function auth(req, res, next) {
const {name, pass} = basicAuth(req) || {};
if (!name || !pass) {
return unauthorized(res);
};
if (name === 'john' && pass === 'secret') {
return next();
}
return unauthorized(res);
};
固然,你也能够在更高层上完成它,如nginx
。
HTTP Basic authentication虽然非常简朴,但仍有一些须要注重的处所:
用户名和暗码在每次要求时都会被带上,纵然要求是经由过程平安衔接发送的,这也是潜伏的能够暴露它们的处所。
假如网站运用的加密要领非常弱,或许被破解,那末用户名和暗码将会立时泄漏。
用户经由过程这类体式格局举行考证时,并没有登出的方法
一样,上岸超时也是没有方法做到的,你只能经由过程修正用户的暗码来模仿。
Cookies
当服务端在相应HTTP要求时,它能够在相应头里加上Set-Cookie
头。然后浏览器会将这个cookie保存起来,并在今后要求同源的地点时,在Cookie
要求头中附上这些cookie。
当运用cookies来举行权限考证时,有以下几点须要注重。
老是将cookies设为HttpOnly
当设置cookies时,老是运用HttpOnly
标识,如许以来cookies就不能经由过程document.cookies
猎取,用以减少被XSS进击能够性。
老是运用署名(signed) cookies
当运用署名cookies时,服务器则能够推断该cookie是不是被客户端更悛改。
不足:
须要消费分外的工夫来抵抗CSRF进击
与REST作风不婚配。由于它在一个无状况协定里注入了状况。
Tokens
当今,JWT(JSON Web Token)无处不在。让我们先来看看它究竟长什么样。
JWT由三部份构成:
Header
,由token的范例和哈希算法构成Payload
,包含了内容主体Signature
,当你挑选HMAC SHA256算法时,它由HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
盘算得出。
将你的Koa
运用加上JWT仅需几行代码:
var koa = require('koa');
var jwt = require('koa-jwt');
var app = koa();
app.use(jwt({
secret: 'very-secret'
}));
// Protected middleware
app.use(function *(){
// content of the token will be available on this.state.user
this.body = {
secret: '42'
};
});
例子:
curl --header "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ" my-website.com
假如你在写供应给原生挪动运用或单页web运用的API,JWT是一个不错的挑选。
不足:
须要分外的步伐来防护XSS进击
Signatures
不论是运用cookies照样token,假如你传输的内容被别人截获,那末它们将能够很容易得伪装成实在的用户。
假如处理这个题目?当我们议论的是API之间的通讯,而不是浏览器之间的通讯时,有一个方法。
当API的消费者发送一个须要权限考证的要求时,你能够对全部要求用一个私钥举行哈希。你能够运用的要求的内容有:
HTTP要领
要求途径
HTTP头
HTTP体
以及一个私钥
API的消费者和供应者都必需持有雷同的私钥。在天生了signature
以后,你必需将其加在query string
或HTTP头中。别的,还需附上一个时候戳,用于推断逾期。
当这么做时,纵然你传输的内容暴露了,进击者也没法伪装成实在用户,由于它没法本身天生signature
。
不足:
不能用于浏览器/客户端中,只能用于API之间的通讯中。
一次性暗码
一次性暗码算法运用一个同享的密钥和一个当前时候戳或计数器来天生一个一次性暗码:
基于时候的一次性暗码算法,运用一个当前时候的时候戳
基于HMAC的一次性暗码算法,运用一个计数器
这些要领被用于两重认证(two-factor authentication)中:一个用户输入了用户名和暗码,然后服务器和客户端同时天生一个一次性暗码。
在Node.js
中,运用notp完成它是相对简朴的。
不足:
假如同享密钥被盗取,那末用户的token将能够被捏造
该在什么时候挑选何种考证要领?
假如你只需支撑一个web运用,那末cookies和tokens的完成都是能够的(cookies对XSRF的防护较好,而JWT则更易于防护XSS)。
假如你须要同时支撑web运用和挪动客户端,那末请运用基于token的考证。
假如你正在构建仅与其他API通讯的API,那末就运用signatures。
末了
原文链接:https://blog.risingstack.com/web-authentication-methods-explained/