到上游服务(API或微服务)的流量通常由各种Kong认证插件的应用程序和配置来控制。由于Kong的服务实体(Service Entity)代表自己的上游服务的1对1映射,最简单的方案是在选择的服务上配置认证插件。

目录

  • 通用认证
  • Consumers
  • 匿名访问
    • 1. 创建示例Service和Route
    • 2. 为服务配置key-auth插件
    • 3.验证key-auth插件是否配置正确
    • 4.创建匿名consumer
    • 5.启用匿名访问
    • 6.验证匿名访问
  • 多重验证

通用认证

  最常见的情况是需要身份验证,并且不允许访问任何未经身份验证的请求。要实现这一点,可以使用任何身份验证插件。这些插件的通用方案/流程如下所示:

1.向一个API或全局添加AUTH插件(无法将其应用于Consumer)
2.创建一个Consumer实体
3.为Consumer提供特定验证插件方案的身份验证凭据
4.现在,每当有请求进入时,Kong将检查提供的凭证(取决于auth类型),如果请求无法验证,它将阻止该请求,或者在header中添加使用者和凭证详细信息并转发请求

上面的通用流程并不总是适用的,例如,当使用外部认证(如LDAP)时,则不会识别Consumer,只有凭证将被添加到转发的标头(forwarded headers)中。

在每个插件的文档中都可以找到身份验证方法的特定元素和示例

Consumers

  最简单的理解和配置consumer的方式是将其于用户进行一一映射,然而,对于这个并不重要。consumer的核心原则是你可以为其添加插件,从而自定义请求行为。所以你可能有移动APP,并为每个应用程序或其版本定义一个消费者。或者每个平台都有一个消费者,例如Android消费者,iOS消费者等。

这对Kong来说是一个不透明的概念,因此他们被称为“消费者”而不是“用户”。

匿名访问

  在Kong 0.10.x版本之前,你可以将指定的API配置为仅允许经过身份验证的访问(通过插件来实现)或只允许匿名访问。也就是说,一个指定的API,不允许对于某些consumer实行身份验证,而对于另外的consumer实行匿名访问。
  在0.10.x版本以后,这些限制取消了。Kong可以配置给定的服务(Service)以允许通过身份验证和匿名访问,你可以使用此配置为低速率限制的匿名用户授予访问权限,并向具有较高速率限制的已认证用户授予访问权限。

要这样配置服务,您首先应用所选的身份验证插件,然后创建一个新的Consumer来表示匿名用户,然后配置您的身份验证插件以允许匿名访问。
这里是一个例子,假设你已经配置了一个名为example-service的Service和相应的Route:

1. 创建示例Service和Route

发出以下CURL请求来创建指向mockbin.org的example-service,它将响应请求:

$ curl -i -X POST \
--url http://localhost:8001/services/ \
--data 'name=example-service' \
--data 'url=http://mockbin.org/request'

向服务添加一条路由:

$ curl -i -X POST \
--url http://localhost:8001/services/example-service/routes \
--data 'paths[]=/auth-sample'

url  http://localhost:8000/auth-sample 现在会回应正在请求的内容

2. 为服务配置key-auth插件

执行以下curl请求来向服务添加一个插件:

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

记住创建的插件id ,步骤5会用到。

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

发出下面curl请求验证key-auth插件是否正确配置在服务上:

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

由于未在header或parameter指定所需的apikey,并且尚未启用匿名访问,所以响应应为403 Forbidden:

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

4.创建匿名consumer

  由Kong代理的每个请求都必须与消费者关联。现在您将创建一个名为anonymous_users的消费者(Kong将在代理匿名访问时使用),方法是发出以下请求:

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

你将会看到类似下面的Response:

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

记住这个Consumer id, 后面的步骤将会用到。

5.启用匿名访问

现在将重新配置key-auth插件以允许通过发出以下请求来进行匿名访问(将步骤2和4中的uuid值替换为以下示例uuids)

$ curl -i -X PATCH \
--url http://localhost:8001/plugins/<your-plugin-id> \
--data "config.anonymous=<your-consumer-id>"

config.anonymous = <your-consumer-id>参数表示本服务上的key-auth插件允许匿名访问,并将此访问与我们在上一步中收到的Consumer id相关联。在此步骤中提供有效且预先存在的Consumer id - 在配置匿名访问时,不会对consumer的id进行检验,如果配置了一个不存在的或错误的consumer id,则会导致配置错误插件不能正常运行。

6.验证匿名访问

通过发出以下请求确认您的服务现在允许匿名访问:

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

这与步骤#3中做出的请求相同,但是这次请求应该成功,因为在步骤#5中启用了匿名访问。

Response 大致包含这些字段:

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

请求返回成功,但是是匿名访问。

多重验证

  Kong支持给定服务的多个身份验证插件,允许不同的客户端使用不同的身份验证方法访问给定的服务或路由。
在评估多个身份验证凭证时,可以将auth插件的行为设置为执行逻辑AND或逻辑OR。该行为的关键是配置config.anonymous属性。

  • config.anonymous默认未设置,如果此属性未设置(空),则验证插件将始终执行验证,如果未验证,则返回40x响应。当多个auth插件被调用时,这会导致逻辑AND。
  • config.anonymous 设置为有效的consumer ID。在这种情况下,auth插件只有在尚未认证的情况下才会执行身份验证。当身份验证失败时,它不会返回40x响应,而是将匿名consumer设置为consumer。当调用多个验证插件时,会使用OR+匿名。

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

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

note3:当以AND方式使用OAuth2插件时,用于请求token等的OAuth2端点也需要其他配置的auth插件进行身份验证。

注意:

当在给定服务上以OR方式启用多个身份验证插件并且希望匿名访问被禁止时,则应该在匿名消费者上配置request-termination插件,不然会允许未经授权的请求。

apigateway-kong(六)认证的更多相关文章

  1. 微服务Kong(九)——认证参考

    客户端访问上游API服务,通常由Kong的认证插件及其配置参数来控制. 通用认证 一般情况下,上游API服务都需要客户端有身份认证,且不允许错误的认证或无认证的请求通过.认证插件可以实现这一需求.这些 ...

  2. Kong安装教程(v1.0.2)

    使用的软件 Unbuntu 虚拟机(有自己的服务器更好) PostgreSQL kong kong-dashboard docker spring boot 安装 PostgreSQL kong 需要 ...

  3. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  4. Kong(v1.0.2)认证

    介绍 上游服务(api或微服务)的流量通常由各种Kong的authentication plugins的应用程序和配置控制.由于Kong的服务实体表示您自己的上游服务的一对一映射,所以最简单的场景是在 ...

  5. 微服务,ApiGateway 与 Kong

    一. 微服务 二. Api Gateway 三. Kong 的使用 一. 微服务 对于一些传统的 大型项目,传统的方式会有一些缺陷,比如说 新人熟悉系统成本高(因为整个系统作为一个整体,彼此会有一定的 ...

  6. drf三大认证:认证组件-权限组件-权限六表-自定义认证组件的使用

    三大认证工作原理简介 认证.权限.频率 源码分析: from rest_framework.views import APIView 源码分析入口: 内部的三大认证方法封装: 三大组件的原理分析: 权 ...

  7. Spring Security OAuth2.0认证授权六:前后端分离下的登录授权

    历史文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二:搭建资源服务 Spring Security OA ...

  8. [Kong] basic-auth基本认证及ACL鉴权

    目录 basic-auth 1. Route上启用插件 2. 创建一个Consumer 3. 为Consumer创建凭证 4. 验证凭证 ACL 用户鉴权 1. 在route上启用ACL鉴权插件 2. ...

  9. [Kong] key-auth实现对API请求的密钥认证

    目录 1. 配置密钥验证插件 2. 确认插件配置正确 3. 创建cunsumer 4. 给cunsumer提供关键凭证 5. 验证 6. 小结 [前言]: 下面我们将配置key-auth插件以向服务添 ...

随机推荐

  1. PHP从入门到精通(六)

    PHP中的错误处理 1.PHP的错误级别:见表格.2.调整PHP错误报告级别:PHP中,调整错误报告级别的方式有两种: ①修改PHP.ini文件的配置项.a.会导致在当前服务器环境下所有PHP文件都受 ...

  2. git使用(2)

    1.远程仓库 a SSHKEY 第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到 ...

  3. Linux内核分析第四周学习总结

    朱国庆+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 扒开系统调用的三层皮 ...

  4. Sprint 冲刺第二阶段之1---5天(上)

    11月24号——12月8号,这一个时间段学校的电压不是很稳定,时不时会断电,为了冲刺的完整性,我们商量决定把这一时间段做的事情写成一个连贯的小日记.然后统一在整个时间段一起发出来. 经过一个阶段的努力 ...

  5. 虚拟机Linux(centos)系统能ping通主机,主机无法ping通Linux解决方案

    本文引用:https://blog.csdn.net/clean_water/article/details/53023308 三个步骤: 第一步:虚拟机网络连接方式选择Nat 第二步.关闭liunx ...

  6. 素数问题练习_HDOJ1262

    HDOJ1262_寻找素数对 和上一篇博客一样的解法,将10000以内的所有素数求出即可解题. #include<stdio.h> #include<stdlib.h> #in ...

  7. Caffe2的安装

    源码下载 首先下载caffe2的源码:https://github.com/caffe2/caffe2 网上都建议使用git命令下载,因为caffe2依赖了很多第三方模块,git会根据依赖自动下载第三 ...

  8. Jquery 组 表单验证

    <!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...

  9. SpringBoot(十五)_springboot实现预览pdf

    最近,项目上要做个打印的东西,还要预览.我想就直接生成pdf预览,然后用户选择打印 于是,昨天找了找资料.一般用itext 进行转pdf.于是我就用springboot试了试,代码比较简单,现在只是简 ...

  10. jvm学习三:自定义ClassLoader

    第一节我们说过一句话:所有的Java虚拟机实现必须在每个类或接口被Java程序“ 首次主动使用”时才初始化他们 但类加载器却不是这样:类加载器不需要等到某个类“被首次主动使用”时才加载类 两句话的区别 ...