客户端访问上游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. Codeforces807 A. Is it rated? 2017-05-08 23:03 177人阅读 评论(0) 收藏

    A. Is it rated? time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  2. java分层

    一.为什么要分层. 以前的我们,写代码的时候,都在main()方法中,出现了错误,就慢慢调试,这样浪费了我们很长的时间,而我们程序员的时间是非常宝贵的 但是当我们使用分层架构的时候,就可以清晰明确的知 ...

  3. Billman_ford货币升值——正权回路

    2240和1860那个题目很像啊 都是问货币能不能增多,钻社会制度得空子啊哈哈 唯一不同得是你的起点是任意一个点,这个比较麻烦了,多了一层循环嘞 处理货币名可以用map分配id 然后就是老套的Bill ...

  4. Paul Simon -- Duncan

    Paul Simon -- Duncan (London,January 1972) Couple in the next roomBound to win a prizeTheyve been go ...

  5. 使用VSTS进行单元测试练习

    本次作业要求:练习教科书第22~25页单元测试练习,要求自行安装Visual Studio开发平台,版本至少在2010以上,要求把程序安装过程和练习过程写到博客上,越详细越好,要图文并茂,没有书的同学 ...

  6. WPF Auto LogOff

    Implementation of Auto Logoff Based on User Inactivity in WPF Application http://www.codeproject.com ...

  7. C# 创建、部署和调用WebService简单示例

    webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 概念性的东西就不说太多,下面开始创建一个简单的webservice的例子.这里我用的是Visual Studio 201 ...

  8. C#线程运用基础

    ThreadStart ts=new ThreadStart(a.f);//ThreadStart 是一个委托,用以关联a.f方法Thread th=new Thread (ts);//Thread是 ...

  9. UWP开发---通过委托跨页面导航

    -前言 做过.Net开发的都了解,当二级窗口操作主窗口的控件时通常用委托的方式.那么在UWP开发中,常常会遇到MainPage的二级Frame里面的内容去操作MainPage的导航跳转,具体看下图: ...

  10. .NET Core中使用Dapper操作Oracle存储过程最佳实践

    为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为OracleDbType.RefCursor,输出为:ParameterDir ...