资讯专栏INFORMATION COLUMN

Koa-jwt 说明文档(机翻润色)

Cristic / 1668人阅读

摘要:机翻润色这个模块可以让你在你的应用中通过使用以下简称认证请求这个文档做了一个很好的介绍如果你使用版本同时你有一个低于版本的安装主分支仓库上的译者注上的版本使用所以必须是以上如果你使用你需要从安装这个代码在分支上安装用例认证中间件

KOA-JWT (机翻润色)

node>=7.6.0

npm v3.2.2

这个模块可以让你在你的KOA应用中通过使用JSON WEB TOKEN(以下简称JWT)认证HTTP请求

这个文档做了一个很好的介绍.

如果你使用KOA版本2.+,同时你有一个低于7.6版本的node. 安装koa-jwt@2

主分支(Koajwt git仓库上的.译者注)上的koa-jwt版本3+使用async/await,所以必须是node 7.6以上

如果你使用koa1,你需要从npm安装koa-jwt@1.这个代码在koa-v1分支上

安装

$ npm install koa-jwt

用例

JWT认证中间件的认证通过使用JWT令牌(token,译者注).如果令牌有效,ctx.state.user(默认情况下)会被设置成解码的JSON对象,以便于在稍后的中间件中进行认证或访问控制.

检索令牌

令牌通常被包产在一个名为Authorization的HTTP头中,但也能通过cookie来进行,但是也可以使用Cookie来提供令牌,只要在opts.cookie选项上设置为包含令牌的cookie的名称.也可以通过opts.getToken选项完成自定义的令牌检索.返回的函数应该匹配以下接口:

/**
 * 自定义令牌解析器
 * @this 传入中间件的CTX对象
 *
 * @param  {object} opts     中间件选项
 * @return {String|null}    返回被解析的令牌,如果没有找到则返回null
 */

令牌解析顺序如下所示.第一个被解析的非空令牌将被用于验证

运行opts.getToken 函数

检查cookies(如果cookies被设置了)

检查承载令牌的认证头(header)

传递密钥

通常你在opts.secret中提供了一个多带带的开放密钥,但是另一个替代方案是在一个更靠前的中间件中设置ctx.state.secret,通常是每个请求中.如果这个属性存在,它将用来替换opts.secret中的密钥.

检查销毁密钥

你可以提供一个异步的函数来让koa-jwt检查令牌是否被撤销.这个函数应该被设置再opts.isRevoked属性中.你提供的函数应该匹配以下接口:

/**
 * 你自定义的检索撤销解析器
 *
 * @param  {object}      ctx     传递给中间件的CTX对象
 * @param  {object}      token     令牌
 * @param  {object}      user     令牌的内容
 * @return {Promise}     如果令牌没有被销毁, Promise必须被解析为false,其他情况下(Promise解析为true或erro)令牌被销毁.
 */
例子
var Koa = require("koa");
var jwt = require("koa-jwt");

var app = new Koa();

// Custom 401 handling if you don"t want to expose koa-jwt errors to users
app.use(function(ctx, next){
  return next().catch((err) => {
    if (401 == err.status) {
      ctx.status = 401;
      ctx.body = "Protected resource, use Authorization header to get access
";
    } else {
      throw err;
    }
  });
});

// Unprotected middleware
app.use(function(ctx, next){
  if (ctx.url.match(/^/public/)) {
    ctx.body = "unprotected
";
  } else {
    return next();
  }
});

// Middleware below this line is only reached if JWT token is valid
app.use(jwt({ secret: "shared-secret" }));

// Protected middleware
app.use(function(ctx){
  if (ctx.url.match(/^/api/)) {
    ctx.body = "protected
";
  }
});

app.listen(3000);

你也可以在某些条件下有条件的运行koa-jwt中间件:

var koa = require("koa");
var jwt = require("koa-jwt");

var app = new Koa();

// Middleware below this line is only reached if JWT token is valid
// unless the URL starts with "/public"
app.use(jwt({ secret: "shared-secret" }).unless({ path: [/^/public/] }));

// Unprotected middleware
app.use(function(ctx, next){
  if (ctx.url.match(/^/public/)) {
    ctx.body = "unprotected
";
  } else {
    return next();
  }
});

// Protected middleware
app.use(function(ctx){
  if (ctx.url.match(/^/api/)) {
    ctx.body = "protected
";
  }
});

app.listen(3000);

更多关于unless的例子,请点击koa-unless

即使没有找到认证头,你也可以通过添加一个passthrough选项来保证始终传递到下一个(中间件)

app.use(jwt( { secret: "shared-secret", passthrough:true }))

通过这个选项,使得下游中间件可以基于ctx.state.user是否设置做出决定

如果你更喜欢使用另外一个ctx key来表示解码数据,只需要传入key属性,如下:

app.use(jwt({ secret: "shared-secret", key: "jwtdata" }));

此时解码数据可以通过ctx.state.jwtdata得到(替换掉默认的ctx.state.user)

你同样可以指定audience和/或issuer

app.use(jwt({ secret:   "shared-secret",
              audience: "http://myapi/protected",
              issuer:   "http://issuer" }));

如果koa-jwt有设置一个expiration(exp),它将会被检查到.

如果存在tokenkey 选项,并且找到有效的令牌,原始令牌数据可以从随后的中间件中的ctx.state[opts.tokenKey]属性中得到.

这个模块也支持令牌标记为公钥/私钥对. 作为秘钥的替代,你可以通过Buffer指定一个Public key

var publicKey = fs.readFileSync("/path/to/public.pub");
app.use(jwt({ secret: publicKey }));

sercret选项是一个函数时,这个函数将会被每个koa-jwt接受到,用于决定哪个密钥会被用于验证JWT

这个方法的签名应该是这样的: (header) => [Promise(secret)], header表示令牌头, 如果想作为支持JWKS的令牌头的实例, 应当包含algkid:算法和密钥ID字段

通过使用 node-jwks-rsa 组件,这个选项也可以用于支持JWKS(JSON Web Set),如下:

const { koaJwtSecret } = require("jwks-rsa");

app.use(jwt({ secret: koaJwtSecret({
                        jwksUri: "https://sandrino.auth0.com/.well-known/jwks.json",
                        cache: true,
                        cacheMaxEntries: 5,
                        cacheMaxAge: ms("10h") }),
              audience: "http://myapi/protected",
              issuer:   "http://issuer" }));
关联模块
jsonwebtoken — JSON Web Token signing and verification

注意koa-v2版本的koa-jwt不再支持从jsonwebtoken中导出sign,verify和decode函数

原文地址: https://github.com/koajs/jwt

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83458.html

相关文章

  • jwt前后端整合方案

    摘要:到这里,基于的前后端分离实现方案就搞定啦四关于的一些思考实际上,在使用的过程中有一个比较致命的缺点,就是一旦签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。结语以上是关于基于的前后端分离实现方案的总结和思考。 一、jwt是什么 JWT全称, JSON Web Token,是一个以JSON为基准的标准规范。 举例:服务器认证以后,生成一个 JSON 对象,发回给用户,就像下...

    nevermind 评论0 收藏0
  • 一个基于Node.js的本地快速测试服务器

    摘要:一个本地的基于的测试服务器支持快速的启动容器服务支持快速的发送,请求,并记录在文件夹下,并在控制台输出支持一个函数完成跨域请求创建本地静态服务器第一个参数为静态文件地址,第二个参数为端口号创建请求请求打印在控制台并写入文件第 local-web-test showImg(https://segmentfault.com/img/remote/1460000016045460);一个本地...

    liukai90 评论0 收藏0
  • [译]web权限验证方法说明

    摘要:前言本文将会从最基本的一种权限验证说起,即,然后是基于和的权限验证,最后则是和一次性密码。由于它不依赖于,等任何外部因素,所以它是最简单的权限验证方法。当使用来进行权限验证时,有以下几点需要注意。 前言 本文将会从最基本的一种web权限验证说起,即HTTP Basic authentication,然后是基于cookies和tokens的权限验证,最后则是signatures和一次性密...

    MonoLog 评论0 收藏0
  • 编程中的那些套路——关于装饰器模式

    该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天我们来谈谈装饰器模式,想象一个场景: 有一篇帖子 帖子的内容我写好了, 三个部门的人员想控制它. 编辑组要添导读文字 审核组要去敏感字 市场部想在末尾加点广告 我只是一篇帖子,由你们来处置吧。 此时如何处理呢?如何写出符合面向对象三特性五原则的代码呢?由此引出装饰器模式就发挥作用了 一言不合来看看代码: 装...

    lavor 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<