目前根据业务需要先介绍2种认证插件:Key Authentication 及 HMAC-SHA1 认证

 Key Authentication

向API添加密钥身份验证(也称为API密钥)。 然后,消费者可以在 querystring 参数或 Header 头中添加其密钥,以验证其请求。

进入之前部署好的kong-ui,选择plugins,点击+号

按需求输入参数

同样创建一个消费者

其中客户Id为选填

生成后进入消费者列表,编辑该用户,按一下操作生成对应的key。

同时我们可以看到消费者中包含有其他插件所需的属性等,可以按需自己生成。

添加后如下

使用起来也很简单,将key(之前添加插件是设置的key名称)插入header值即可

如果验证错误则返回403

 HMAC Authentication

为您的API添加HMAC签名身份验证以建立使用者的身份。 插件将在代理授权和授权Header中检查有效的签名(按此顺序)。 这个插件实现遵循draft-cavage-http-signatures-00草案略有改变的签名方案。

根据如上方法,同理增加HMAC认证凭证

同理加入HMAC插件

HMAC-SHA1,C#代码实现:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text; namespace Security.Cryptography
{
public static class HMAC_SHA1
{
public static string Sign(string text, string key, string inputCharset = "utf-8")
{
Encoding _encode = Encoding.GetEncoding(inputCharset);
byte[] _byteData = Encoding.GetEncoding(inputCharset).GetBytes(text);
HMACSHA1 _hmac = new HMACSHA1(_encode.GetBytes(key)); using (CryptoStream _cs = new CryptoStream(Stream.Null, _hmac, CryptoStreamMode.Write))
{
_cs.Write(_byteData, , _byteData.Length);
}
return Convert.ToBase64String(_hmac.Hash);
}
}
}

请求的时候主要是header中

Authorization 的构造,根据官方文档

Authorization: hmac username="bob", algorithm="hmac-sha1", headers="date content-md5", signature="Base64(HMAC-SHA1(signing string))"

如果有多个Header的话,header名称用空格隔开,注意官方文档中的"date"如今应该改成"x-date",date的格式请使用GMT时间诸如"Wed, 01 Mar 2017 05:05:24 GMT"

官方文档中加密字符串:

date: Fri, 09 Oct 2015 00:00:00 GMT\ncontent-md5: lCMsW4/JJy9vc6HjbraPzw==

注意也要将date修改成x-date,如果没有content-md5这个头,那就不用加\n,直接为

x-date: Fri, 09 Oct 2015 00:00:00 GMT

这边提供一组正确的加密字串,供大家实现算法后验证

secret:secret7496

加密前字符串:x-date: Wed, 01 Mar 2017 05:05:24 GMT

摘要字符串为:XefFQYm8HRXsocJHF4ibDEPWW3k=

重要备注:

这个HMAC主要碰到2类错误

1.HMAC signature cannot be verified, a valid date or x-date header is required for HMAC Authentication

这个错误主要2种情况都跟日期有关

  1)服务器时间跟客户端发出去的x-date的间隔时间超过之前定义的clock skew秒数(通过docker容器安装的容易产生这个问题)

  2)请确认是GMT时间格式

  3)把date改成x-date

2.HMAC signature does not match

这个就是签名算法有问题了

API网关Kong系列(四)认证配置的更多相关文章

  1. API网关Kong系列(一)初识

    最近工作需要,加上国内Kong的文章相对缺乏(搜来搜去就那么两篇文章),而且官方文档在某些demo上也有一些过时的地方,遂提笔记录下这些,希望能有帮助. 先随大流介绍下KONG(主要参考官网): 官方 ...

  2. API网关Kong系列(三)添加服务

    进入之前部署好的kong-ui,默认第一次登陆需要配置kong服务的地址 进入API菜单,点击+号 按照要求填入相关信息 至此完成,可以使用诸如 https://your.domain.com:208 ...

  3. API网关Kong系列(二)部署

    部署环境: [OS] centos 6.8(如果是centos6.5,请自行先升级到6.8,否则不支持docker) [Docker] Client version: 1.7.1 Client API ...

  4. API 网关 Kong

    什么是 API 网关? 所谓网关,主要作用就是连接两个不同网络的设备,而今天所讲的 API 网关是指承接和分发客户端所有请求的网关层. 为什么需要网关层?最初是单体服务时,客户端发起的所有请求都可以直 ...

  5. Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用

    写在前面   Api网关我们之前是用 .netcore写的 Ocelot的,使用后并没有完全达到我们的预期,花了些时间了解后觉得kong可能是个更合适的选择. 简单说下kong对比ocelot打动我的 ...

  6. API网关——Kong实践分享

    概述 01 什么是Kong Kong是一个在Nginx中运行的Lua应用程序,可以通过lua-nginx模块实现,Kong不是用这个模块编译Nginx,而是与OpenRestry一起发布,OpenRe ...

  7. API网关--Kong的实践

    1. 什么是Kong 目前互联网后台架构一般是采用微服务,或者类似微服务的形式,应用的请求通常需要访问多个后台系统.如果让每一个后台系统都实现鉴权.限流.负载均衡.审计等基础功能是不合适的,通用的做法 ...

  8. shiro实战系列(四)之配置

    Shiro之配置 Shiro 被设计成能够在任何环境下工作,从最简单的命令行应用程序到最大的的企业群集应用.由于环境的多样性,使得许多配置机制适用于它的配置. 一. 许多配置选项 Shiro的Secu ...

  9. API网关Kong部署和使用文档

    KONG安装使用说明 系统版本:ubuntu14 1.下载安装包 $ wget https://github.com/Mashape/kong/releases/download/0.8.3/kong ...

随机推荐

  1. php 递归调用又一种方法

     public static function encodeXml($data){        $attr = $xml = "";        foreach($data a ...

  2. JSP--TOMCAT-MYSQL web页面添加

    addStudent.jsp如下<%@ page language="java" import="java.util.*" pageEncoding=&q ...

  3. js中的转换方法

    1.var colors =['red','blue','green']; console.log(colors.toString()); // red,blue,green 总结:toString( ...

  4. 基于TextRank提取关键词、关键短语、摘要

    一.TextRank原理 TextRank是一种用来做关键词提取的算法,也可以用于提取短语和自动摘要.因为TextRank是基于PageRank的,所以首先简要介绍下PageRank算法. 1. Pa ...

  5. python3 线性同余发生器 ( random 随机数生成器 ) 伪随机数产生周期的一些探究

    import random x=[str(random.randint(0, 5)) for i in range(10)] x_str=''.join(x) y=[str(random.randin ...

  6. php中弱语言类型的底层实现

    PHP是弱语言类型,主要分为三类: 1.标量类型:integer.string.float.boolean 2.复合类型:array.object 3.特殊类型:resource.null php是通 ...

  7. HDU1212 大数膜

    大数MOD #include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm& ...

  8. (2)字符编码关系和转换(bytes类型)

    ASCII 占一个字节,只支持英文 GB2312 占2个字节,只支持6700+汉字 GBK 是GB2312的升级版,支持21000+汉字 Shift-JIS 日本字符编码 ks_c-5601-1987 ...

  9. LG2375 [NOI2014]动物园

    题意 给定一个长为\(L\)的字符串(\(L \leq 1e6\)) 求一个\(num\)数组,\(num[i]\)表示长度为\(i\)的前缀中字符串\(S'\)的数量,其中\(S'\)既是该前缀的前 ...

  10. matplotlib-------标记特殊点

    import matplotlib.pyplot as plt import numpy as np def demo_test(): a=np.array([0.15,0.16,0.14,0.17, ...