KoaJS Authentication

  • 定义和使用

    身份验证是一个过程,其中提供的凭据将与本地操作系统或身份验证服务器中授权用户信息数据库中的凭据进行比较。如果凭据匹配,则过程完成,并授予用户访问权限。
    我们将创建一个使用基本 HTTP 身份验证的非常基本的身份验证系统。这是实施访问控制的最简单的可能方法,因为它不需要 cookies、会话或其他任何东西。要使用它,客户机必须在发出每个请求时发送 Authorization 头。用户名和密码不是加密的,而是连接在一个字符串中,如下所示。
    username:password
    
    这个字符串用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 _router = require('koa-router')();
    
    var app = new 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;
            }
        }
    });
    
    //在这里设置身份验证作为第一个中间件。
    //如果用户未通过身份验证,则返回错误。
    _router.get('/protected', auth(credentials), async (ctx){
        ctx.body = 'You have access to the protected area.';
    });
    
    //这里没有认证中间件。
    _router.get('/unprotected', async (ctx){
        ctx.body = "Anyone can access this area";
    });
    
    app.use(_router.routes());
    app.listen(3001);
    
    我们已经创建了一个错误处理中间件来处理所有与身份验证相关的错误。然后,我们创建了两条路线–
    • /protected - 只有用户发送正确的身份验证标头时,才能访问此路由。对于所有其他人,它会给出一个错误。
    • /unprotected - 任何人都可以访问此路由,无论是否有身份验证。
    现在,如果您向 /protected 发送一个没有身份验证头或使用错误凭据的请求,您将收到一个错误。例如,
    curl http://localhost:3001/protected
    您将收到的响应为-
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: Basic
    Content-Type: text/plain; charset=utf-8
    Content-Length: 28
    Date: Sat, 17 Sep 2020 19:05:56 GMT
    Connection: keep-alive
    
    Please authenticate yourself
    
    但是,使用正确的凭据,您将获得预期的响应。例如,
    curl -H "Authorization: basic QXl1c2g6SW5kaWE=" http://localhost:3001/protected -i
    
    你得到的回答是-
    HTTP/1.1 200 OK
    Content-Type: text/plain; charset=utf-8
    Content-Length: 38
    Date: Sat, 17 Sep 2020 19:07:33 GMT
    Connection: keep-alive
    
    You have access to the protected area.
    
    未受保护的路线仍然对所有人开放。