客户端访问上游API服务,通常由Kong的认证插件及其配置参数来控制。

通用认证

  一般情况下,上游API服务都需要客户端有身份认证,且不允许错误的认证或无认证的请求通过。认证插件可以实现这一需求。这些插件的通用方案/流程如下:

    1、向一个API或全局添加AUTH插件(此插件不作用于consumers);

    2、常见一个consumer对象;

    3、为consumer提供指定的验证插件方案的身份验证凭据;

    4、现在,只要有请求进入Kong,都将检查其提供的身份验证凭据(取决于auth类型),如果该请求无法被验证或者验证失败,则请求会被锁定,不执行向上有服务转发的操作。

  但是,上述的一般流程并不是总是有效的。譬如,当使用了外部验证方案(比如LDAP)时,KONG就不会(不需要)对consumer进行身份验证。

Consumers

  最简单的理解和配置consumer的方式是,将其于用户进行一一映射,即一个consumer代表一个用户(或应用)。但是对于KONG而言,这些都无所谓。consumer的核心原则是你可以为其添加插件,从而自定义他的请求行为。所以,或许你会有一个手机APP应用,并为他的每个版本都定义一个consumer,又或者你又一个应用或几个应用,并为这些应用定义统一个consumer,这些都无所谓。这是一个模糊的概念,他叫做consumer,而不是user!万万要区分开来,且不可混淆。

匿名访问

  在Kong 0.10.x版本之前,你可以将指定的API配置为仅允许经过身份验证的访问(通过插件来实现)或只允许匿名访问。也就是说,一个指定的API,不允许对于某些consumer实行身份验证,而对于另外的consumer实行匿名访问。

  在0.10.x版本以后,这些限制取消了--同一个API可以同时实现验证和匿名两种访问方式。你可以使用他的这种特性,为一个API提供两种服务方式:以较低的速率提供匿名访问权限,以较高的速率实现验证访问权限。为指定API提供一个用户试用体验。

  要配置这样的API,您首先应用所选的认证插件,然后创建一个新的consumer来表示匿名用户,然后配置你的身份验证插件以允许匿名访问。这里有一个示例,它假设您已经配置了一个名为example-api的API:

  1、创建example-api:

$ curl -i -X POST \
--url http://localhost:8001/apis/ \
--data 'name=example-api' \
--data 'uris=/auth-sample' \
--data 'upstream_url=http://mockbin.org/request'

    此时,无论什么样的请求,http://localhost:8000/auth-sample 都会有输出信息。

  2、配置 key-auth 插件:

$ curl -i -X POST \
--url http://localhost:8001/apis/example-api/plugins/ \
--data 'name=key-auth'

  3、验证 key-auth 插件是否正确配置:

$ curl -i -X GET \
--url http://localhost:8000/auth-example

    此时,由于你并未在请求参数或请求头里使用apikey,所以这个请求会报403错误:

HTTP/1.1  Forbidden
... {
"message": "No API key found in headers or querystring"
}

  4、创建一个匿名consumer:

    每一次的KONG的代理请求,都会有一个对应的consumer对象。这里创建一个anonymous_consumer来测试API的匿名请求:

$ curl -i -X POST \
--url http://localhost:8001/consumers/ \
--data "username=anonymous_users"

    你会得到以下的返回信息:

HTTP/1.1  Created
Content-Type: application/json
Connection: keep-alive {
"username": "anonymous_users",
"created_at": ,
"id": "bbdf1c48-19dc-4ab7-cae0-ff4f59d87dc9"
}

  5、开启API的匿名请求:

    您现在将重新配置密钥验证插件,以允许匿名访问:

$ curl -i -X PATCH \
--url http://localhost:8001/apis/example-api/plugins/4a223b63-c44a-40e5-9102-b23335f594ca \
--data "config.anonymous=bbdf1c48-19dc-4ab7-cae0-ff4f59d87dc9"

    这里的两个uuid,分别是第2步和第4步中产生的uuid。具体请参考两步操作中返回参数id。

    config.anonymous = <consumer uuid>参数表示该API上的密钥验证插件允许匿名访问,并将此访问与上一步中收到的consumer的ID相关联。在此步骤中,您需要提供有效的consumerID - 当进行匿名配置时,不会对consumer的id进行检验,如果配置了一个不存在的或错误的consumerid,则会导致插件不能正常运行。

  6、验证匿名访问:

$ curl -i -X GET \
--url http://localhost:8000/auth-sample

    这个访问请求和第三步中的一样,然而,此时的访问是通过的,只因为你在第五步中配置了匿名访问。返回内容大致是:

{
...
"headers": {
...
"x-consumer-id": "713c592c-38b8-4f5b-976f-1bd2b8069494",
"x-consumer-username": "anonymous_users",
"x-anonymous-consumer": "true",
...
},
...
}

    这显示,请求通过了,并且是以匿名的方式。

多重验证

  Kong 0.10.x扩展了为给定API应用多个验证插件的能力,并允许不同的客户端使用不同的身份验证方法来访问给定的API服务。在评估多个身份验证凭据时,可以将验证插件的行为设置为逻辑AND或逻辑OR。该行为的关键是配置config.anonymous属性。

  · config.anonymous 默认为未设置。如果此属性未设置(空),则auth插件将始终执行身份验证,并返回40x响应(如果未验证)。当调用多个验证插件时,会导致逻辑AND。

  · config.anonymous 设置为有效的consumer ID。在这种情况下,auth插件只有在尚未认证的情况下才会执行身份验证。当身份验证失败时,它不会返回40x响应,而是将匿名consumer设置为consumer。当调用多个验证插件时,会使用OR+匿名。

备注1:所有的或任何一个验证插件都可配置为可使匿名访问的。但是,如果要混合使用验证插件,则对于匿名访问的配置就需要进行甄选,否则会出现混乱。

备注2:如果使用AND逻辑,则最后一个执行的验证插件将是把验证信息传递给上游服务的那个。当使用OR逻辑时,传递给上游服务验证信息的那个插件,将会是第一个成功验证consumer的那个插件,或者是最后一个配置了匿名访问权限的那个插件。

ps:如果对API使用多个验证插件,且插件间的逻辑配置为OR的话,最好不要为每个插件开启匿名访问,这样才能保证最终能成功请求的consumer是预期的那个。否则会有不可预期的结果出现。

微服务Kong(九)——认证参考的更多相关文章

  1. 微服务统一登陆认证怎么做?JWT ?

    无状态登录原理 1.1.什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session. 例如登录:用户登 ...

  2. 微服务常见安全认证方案Session token cookie跨域

    HTTP 基本认证 HTTP Basic Authentication(HTTP 基本认证)是 HTTP 1.0 提出的一种认证机制,这个想必大家都很熟悉了,我不再赘述.HTTP 基本认证的过程如下: ...

  3. 7.【Spring Cloud Alibaba】微服务的用户认证与授权

    有状态 vs 无状态 有状态 那么Session在何时创建呢? 当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServ ...

  4. .NETCore微服务探寻(二) - 认证与授权

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

  5. 微服务Kong(八)——代理参考

    Kong侦听四个端口的请求,默认情况是: 8000:此端口是Kong用来监听来自客户端的HTTP请求的,并将此请求转发到您的上游服务.这也是本教程中最主要用到的端口. 8443:此端口是Kong监听H ...

  6. 微服务Kong(六)——配置参考

    1. 配置加载 如果您通过其中一个官方软件包安装了Kong,Kong会附带默认配置文件,该文件可以在/etc/kong/kong.conf.default中找到.要开始配置Kong,您可以复制此文件: ...

  7. 微服务Kong(十)——负载均衡参考

    KONG为请求多个后端服务提供了多种负载均衡方案:一种是简单的基于DNS,另一种是更加动态的环形均衡器,他在不需要DNS服务器的情况下也允许服务注册. 一.基于DNS的负载均衡 当使用基于DNS的负载 ...

  8. 微服务Kong(七)——CLI参考

    KONG提供了一套CLI(命令行界面)命令,您可以通过它来启动.停止和管理您的Kong实例.CLI管理您的本地节点(如在当前机器上). 全局配置 所有命令都采用一组指定的可选标志作为参数: --hel ...

  9. 微服务Kong(五)——添加一个用户(Consumer)

    在本节中,我们将学习如何添加一个用户(consumer)到KONG实例中.用户是与使用您的API的个人相关联,可用于跟踪,访问管理等. NOTE:本节假设您已经正确启用了密钥验证插件.如果没有,请参考 ...

随机推荐

  1. (并查集)Connections in Galaxy War -- zoj --3261 还没写

    链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 http://acm.hust.edu.cn/vjudge/ ...

  2. Postman - 測試 API 的好工具

    POSTMAN in Google APP Store 因為工作的關係,常常寫一些 API 供 APP 使用.以前傻傻的,每次測試的時候都會自己刻一個 HTML 的表單,一個一個填入 input ,接 ...

  3. POJ 2462 / HDU 1154 Cutting a Polygon

    就这样莫名其妙的过了,不过可以确定之前都是被精度卡死了.真心受不了精度问题了. 题意:一条直线在一个不规则多边形内的长度,包括边重合部分. 首先计算出所有交点,然后按想x,y的大小进行二级排序. 然后 ...

  4. Tomcat服务器(一)

    一.tomcat目录中重要的文件: bin 存放启动和关闭的脚本 conf  存放配置文件 logs 日志文件 webapps 存放部署的项目 work 工作目录 Web应用开发好后,若想供外界访问, ...

  5. ActiveMq 总结(一)

    1. 背景 当前,CORBA.DCOM.RMI等RPC中间件技术已广泛应用于各个领域.但是面对规模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性:(1)同步通信:客户发出调用后,必须等待服务 ...

  6. 解决使用ICsharpCode解压缩时候报错Size MisMatch4294967295;的错误

    如果是一个文件夹生成的zip文件,解压缩时候不会报错. 如果是一个文件夹里面包含着两个子文件夹,而且每个子文件夹里面都有着文件.生成的zip文件在解压时候就出报这个错误. 具体的解决办法,通过网上搜索 ...

  7. 第五章 HashMap源码解析

    5.1.对于HashMap需要掌握以下几点 Map的创建:HashMap() 往Map中添加键值对:即put(Object key, Object value)方法 获取Map中的单个对象:即get( ...

  8. leetcode 123. 买卖股票的最佳时机 III JAVA

    题目: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你必须在再次购买前出 ...

  9. LOJ#3086. 「GXOI / GZOI2019」逼死强迫症(矩阵快速幂)

    题面 传送门 题解 先考虑全都放\(1\times 2\)的方块的方案,设防\(i\)列的方案数为\(g_i\),容易推出\(g_i=g_{i-1}+g_{i-2}\),边界条件为\(g_0=g_1= ...

  10. python os.path 的使用

    import os #该文件所在位置:D:\第1层\第2层\第3层\第4层\第5层\test11.py path1 = os.path.dirname(__file__) print(path1)#获 ...