Koa.js - 身份验证

身份验证是将提供的凭据与本地操作系统或身份验证服务器中授权用户信息数据库中的凭据进行比较的过程。如果凭据匹配,则该过程完成,并授予用户访问权限。

我们将创建一个非常基本的身份验证系统,该系统将使用基本 HTTP 身份验证。这是强制访问控制的最简单方法,因为它不需要 cookie、会话或其他任何东西。要使用此功能,客户端必须随其发出的每个请求一起发送授权标头。用户名和密码未加密,但会像下面这样连接成一个字符串。

用户名:密码

此字符串使用 Base64 编码,并且单词 Basic 放在此值之前。例如,如果您的用户名是 Ayush,密码是 India,那么字符串 "Ayush:India" 将以授权标头中的编码形式发送。

Authorization: Basic QXl1c2g6SW5kaWE=

要在您的 koa 应用中实现此功能,您需要 koa-basic-auth 中间件。使用 − 安装它

$ npm install --save koa-basic-auth

现在打开您的 app.js 文件并在其中输入以下代码。

//这是将要检查身份验证的内容
var credentials = { name: 'Ayush', pass: 'India' }

var koa = require('koa');
var auth = require('koa-basic-auth');
var _ = require('koa-router')();

var app = koa();

//错误处理中间件
app.use(function *(next){
   try {
      yield next;
   } catch (err) {
      if (401 == err.status) {
         this.status = 401;
         this.set('WWW-Authenticate', 'Basic');
         this.body = 'You have no access here';
      } else {
         throw err;
      }
   }
});

// 在此处将身份验证设置为第一个中间件。
// 如果用户未通过身份验证,则返回错误。
_.get('/protected', auth(credentials), function *(){
    this.body = '您有权访问受保护区域。';
    Yield next;
});

// 此处不存在身份验证中间件。
_.get('/unprotected', function*(next){
    this.body = "任何人都可以访问此区域";
    Yield next;
});

app.use(_.routes());
app.listen(3000);

我们创建了一个错误处理中间件来处理所有与身份验证相关的错误。然后,我们创建了 2 个路由 −

  • /protected − 仅当用户发送正确的身份验证标头时,才能访问此路由。对于所有其他情况,它将给出错误。

  • /unprotected − 任何人都可以访问此路由,无论是否经过身份验证。

现在,如果您向 /protected 发送请求时没有身份验证标头或使用错误的凭据,您将收到错误。例如,

$ curl https://localhost:3000/protected

您将收到以下响应 −

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic
Content-Type: text/plain; charset=utf-8
Content-Length: 28
Date: Sat, 17 Sep 2016 19:05:56 GMT
Connection: keep-alive

Please authenticate yourself

但是,如果凭证正确,您将获得预期的响应。例如,

$ curl -H "Authorization: basic QXl1c2g6SW5kaWE=" https://localhost:3000/protected -i

您将获得以下响应 −

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 38
Date: Sat, 17 Sep 2016 19:07:33 GMT
Connection: keep-alive

You have access to the protected area.

/unprotected 路由仍然可供所有人访问。