乐趣区

关于apache:使用-Apache-APISIX-和-Okta-来实现身份认证

通常利用会通过身份认证辨认用户身份,并依据用户身份 ID 从身份提供方(Identity Provider)获取具体的用户元数据,并以此判断用户是否领有拜访指定资源的权限。身份认证模式分为两大类:传统认证模式和集中认证模式。

在传统认证模式下,各个应用服务须要独自反对身份认证,例如当用户未登录时拜访登录接口,接口返回 301 跳转页面。利用须要开发保护 Session 以及和身份提供商的认证交互等逻辑。传统认证模式的流程如下图所示:首先由用户发动申请(request),而后由网关接管申请并将其转发至对应的应用服务,最初由应用服务与身份提供方对接,实现身份认证(authorization)。 与传统认证模式不同,集中身份认证模式把用户认证从应用服务中抽离了进去,以 Apache APISIX 为例,集中认证的流程如下图所示:首先由用户发动申请(request),而后由前置的网关负责用户认证流程,与身份提供方对接,向身份提供方发送身份认证(authorization)申请。身份提供方返回用户身份信息(user info)。网关实现用户身份辨认后,将用户身份信息通过申请头的模式转发至后端利用。 相比拟传统认证模式,集中认证模式下有如下长处:

  1. 简化利用开发流程,升高开发利用工作量和保护老本,防止各个利用反复开发身份认证代码。
  2. 进步业务的安全性,集中身份认证模式在网关层面可能及时拦挡未经身份认证的申请,爱护后端的利用。

应用 Apache APISIX 配置 Okta 集中身份认证

应用 Apache APISIX 配置 Okta 认证的过程非常简单,从传统身份认证模式切换到集中身份认证模式,只需四步即可实现。

前提条件

已有 Okta 账号。

步骤一:配置 Okta

  1. 登录你的 Okta 账号,并创立一个 Okta 利用,抉择 OIDC 登录模式以及 Web Application 利用类型。

  1. 设置登录和登出的跳转 URL。

其中“Sign-in redirect URIs”为登录胜利容许跳转的链接地址,“Sign-out redirect URIs”示意登出之后跳转的链接地址。在这个示例中,咱们将登录胜利跳转和登出之后跳转的链接地址都设置为 http://127.0.0.1:9080/

  1. 实现设置当前,单击“Save”保留批改。
  2. 拜访利用的 General 页面,获取以下配置,配置 Apache APISIX OpenID Connect 时须要提供这些信息:
  • Client ID:OAuth client ID,即利用的 ID,与下文的 client_id{YOUR_CLIENT_ID} 对应。
  • Client secret:OAuth client secret,即利用密钥,与下文的 client_secret  和 {YOUR_CLIENT_SECRET} 对应。
  • Okta domain:利用应用的域名,与下文的 discovery  中的 {YOUR_ISSUER} 对应。

步骤二:装置 Apache APISIX

你能够通过源码包、Docker、Helm Chart 等多种形式来装置 Apache APISIX。

装置依赖

Apache APISIX 的运行环境须要依赖 NGINX 和 etcd,所以在装置 Apache APISIX 前,请依据您应用的操作系统装置对应的依赖。咱们提供了 CentOS7、Fedora 31 & 32、Ubuntu 16.04 & 18.04、Debian 9 & 10 和 MacOS 上的依赖装置操作步骤,详情请参考 https://apisix.apache.org/zh/…。

通过 Docker 或 Helm Chart 装置 Apache APISIX 时,曾经蕴含了所需的 NGINX 和 etcd,请参照各自对应的文档。

通过 RPM 包装置(CentOS 7)

这种装置形式实用于 CentOS 7 操作系统,请运行以下命令装置 Apache APISIX。

sudo yum install -y https://github.com/apache/apisix/releases/download/2.7/apisix-2.7-0.x86_64.rpm

通过 Docker 装置

详情请参考:https://hub.docker.com/r/apac…。

通过 Helm Chart 装置

详情请参考:https://github.com/apache/api…。

通过源码包装置

  1. 创立一个名为 apisix-2.7 的目录。
mkdir apisix-2.7
  1. 下载 Apache APISIX Release 源码包:
wget https://downloads.apache.org/apisix/2.7/apache-apisix-2.7-src.tgz

您也能够通过 Apache APISIX 官网下载 Apache APISIX Release 源码包。Apache APISIX 官网也提供了 Apache APISIX、APISIX Dashboard 和 APISIX Ingress Controller 的源码包,详情请参考 Apache APISIX 官网 - 下载页。

‍‍‍‍‍‍‍‍‍‍‍‍‍3. 解压 Apache APISIX Release 源码包:

tar zxvf apache-apisix-2.7-src.tgz -C apisix-2.7

4. 装置运行时依赖的 Lua 库:

# 切换到 apisix-2.7 目录
cd apisix-2.7
# 创立依赖
make deps

初始化依赖

运行以下命令初始化 NGINX 配置文件和 etcd。

# initialize NGINX config file and etcd
make init

步骤三:启动 Apache APISIX 并配置对应的路由

  1. 运行以下命令,启动 Apache APISIX。
apisix start
  1. 创立路由并配置 OpenID Connect 插件。

OpenID Connect 配置列表如下:

字段 默认值 应用阐明
client\_id “” OAuth 客户端 ID
client\_secret “” OAuth 客户端密钥
discovery “” 身份提供商的服务发现端点
scope “openid” 须要拜访资源范畴
relm “apisix” 指定 **WWW-Authenticate** 响应头验证信息
bearer\_only false 是否查看申请头中的 token
logout\_path “/logout” 登出的 URI
redirect\_uri request\_uri 身份提供商跳转回来的 URI,默认为申请地址
timeout 3 申请超时工夫,单位为秒
ssl\_verify false 是否身份提供商的校验 ssl 证书
introspection\_endpoint “” 身份提供商的令牌验证端点的 URL,不填则将从 discovery 响应中提取。
introspection\_endpoint\_auth\_method “client\_secret\_basic” 令牌自省的认证办法名称
public\_key “” 验证令牌的公钥
token\_signing\_alg\_values\_expected “” 验证令牌的算法
set\_access\_token\_header true 是否在申请头中携带 access token
access\_token\_in\_authorization\_header false true 时将 access token 搁置在 Authorization 头中,false 时将 access token 搁置在 X-Access-Token 头中。
set\_id\_token\_header true 是否将 ID token 携带至 X-ID-Token 申请头
set\_userinfo\_header true 是否将用户信息携带至 X-Userinfo 申请头

以下代码示例通过 Apache APISIX Admin API 进行创立路由,设置路由的上游为 httpbin.org。httpbin.org 是一个简略的用于接管申请和响应申请的后端服务,下文将应用 httpbin.org 的 get 页面,参考 http bin get (http://httpbin.org/#/HTTP\_Methods/get\_get)。

具体配置项请参考 Apache APISIX OpenID Connect Plugin (https://apisix.apache.org/zh/…)。

curl  -XPOST 127.0.0.1:9080/apisix/admin/routes -H "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1" -d '{"uri":"/*","plugins":{"openid-connect":{"client_id":"{YOUR_CLIENT_ID}","client_secret":"{YOUR_CLIENT_SECRET}","discovery":"https://{YOUR_ISSUER}/.well-known/openid-configuration","scope":"openid profile","bearer_only":false,"realm":"master","introspection_endpoint_auth_method":"client_secret_post","redirect_uri":"http://127.0.0.1:9080/"
        }
    },
    "upstream":{
        "type":"roundrobin",
        "nodes":{"httpbin.org:80":1}
    }
}'

步骤四:拜访 Apache APISIX

  1. 拜访 “http://127.0.0.1:9080/get”,因为开启了 OpenID Connect 插件,所以页面被重定向到 Okta 登录页面。
  2. 输出用户在 Okta 注册的账号密码,单击“Sign in”,登录 Okta 账户。
  3. 登录胜利之后,能胜利拜访到 httpbin.org 中的 get 页面。该 httpbin.org/get 页面将返回申请的数据如下:
   ...
    "X-Access-Token": "******Y0RPcXRtc0FtWWVuX2JQaFo1ZVBvSlBNdlFHejN1dXY5elV3IiwiYWxnIjoiUlMyNTYifQ.***TVER3QUlPbWZYSVRzWHRxRWh2QUtQMWRzVDVGZHZnZzAiLCJpc3MiOiJodHRwczovL3FxdGVzdG1hbi5va3RhLmNvbSIsImF1ZCI6Imh0dHBzOi8vcXF0ZXN0bWFuLm9rdGEuY29tIiwic3ViIjoiMjgzMDE4Nzk5QHFxLmNvbSIsImlhdCI6MTYyODEyNjIyNSwiZXhwIjoxNjI4MTI5ODI1LCJjaWQiOiIwb2ExMWc4ZDg3TzBGQ0dYZzY5NiIsInVpZCI6IjAwdWEwNWVjZEZmV0tMS3VvNjk1Iiwic2NwIjpbIm9wZW5pZCIsInByb2Zpb***.****iBshIcJhy8QNvzAFD0fV4gh7OAdTXFMu5k0hk0JeIU6Tfg_Mh-josfap38nxRN5hSWAvWSk8VNxokWTf1qlaRbypJrKI4ntadl1PrvG-HgUSFD0JpyqSQcv10TzVeSgBfOVD-czprG2Azhck-SvcjCNDV-qc3P9KoPQz0SRFX0wuAHWUbj1FRBq79YnoJfjkJKUHz3uu7qpTK89mxco8iyuIwB8fAxPMoXjIuU6-6Bw8kfZ4S2FFg3GeFtN-vE9bE5vFbP-JFQuwFLZNgqI0XO2S7l7Moa4mWm51r2fmV7p7rdpoNXYNerXOeZIYysQwe2_L****", 
    "X-Id-Token": "******aTdDRDJnczF5RnlXMUtPZUtuSUpQdyIsImFtciI6WyJwd2QiXSwic3ViIjoiMDB1YTA1ZWNkRmZXS0xLdW82OTUiLCJpc3MiOiJodHRwczpcL1wvcXF0ZXN0bWFuLm9rdGEuY29tIiwiYXVkIjoiMG9hMTFnOGQ4N08wRkNHWGc2OTYiLCJuYW1lIjoiUGV0ZXIgWmh1IiwianRpIjoiSUQuNGdvZWo4OGUyX2RuWUI1VmFMeUt2djNTdVJTQWhGNS0tM2l3Z0p5TTcxTSIsInZlciI6MSwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsImV4cCI6MTYyODEyOTgyNSwiaWRwIjoiMDBvYTA1OTFndHAzMDhFbm02OTUiLCJub25jZSI6ImY3MjhkZDMxMWRjNGY3MTI4YzlmNjViOGYzYjJkMDgyIiwiaWF0IjoxNjI4MTI2MjI1LCJhdXRoX3RpbWUi*****", 
    "X-Userinfo": "*****lfbmFtZSI6IlpodSIsImxvY2FsZSI6ImVuLVVTIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsInVwZGF0ZWRfYXQiOjE2MjgwNzA1ODEsInpvbmVpbmZvIjoiQW1lcmljYVwvTG9zX0FuZ2VsZXMiLCJzdWIiOiIwMHVhMDVlY2RGZldLTEt1bzY5NSIsImdpdmVuX25hbWUiOiJQZXRlciIsIm5hbWUiOiJQZXRl****"
    ...

其中:

X-Access-Token:Apache APISIX 将从用户提供商获取到的 access token 放入 X-Access-Token 申请头,能够通过插件配置中的 access_token_in_authorization_header 来抉择是否放入 Authorization 申请头中。X-Id-Token:Apache APISIX 将从用户提供商获取到的 ID token 通过 base64 编码之后放入 X-Id-Token 申请头,能够通过插件配置中的 set\_id\_token\_header 来抉择是否开启该性能,默认为为开启状态。X-Userinfo:  Apache APISIX 将从用户提供商获取到的用户信息,通过 base64 编码之后放入 X-Userinfo,你能够通过插件配置中的 set_userinfo_header 来抉择是否开启该性能,默认为开启状态。 由此能够看到,Apache APISIX 将会携带 X-Access-Token,X-Id-Token,X-Userinfo 三个申请头传递至上游。上游能够通过解析这几个头部,从而获取到用户 ID 信息和用户的元数据。

作者介绍

朱欣欣,API7.AI 工程师,Apache APISIX Committer,开源爱好者,Golang 开发者。

对于 Apache APISIX

===================

Apache APISIX 是一个动静、实时、高性能的开源 API 网关,提供负载平衡、动静上游、灰度公布、服务熔断、身份认证、可观测性等丰盛的流量治理性能。Apache APISIX 能够帮忙企业疾速、平安的解决 API 和微服务流量,包含网关、Kubernetes Ingress 和服务网格等。

寰球已有数百家企业应用 Apache APISIX 解决要害业务流量,涵盖金融、互联网、制作、批发、运营商等等,比方美国航空航天局(NASA)、欧盟的数字工厂、中国航信、中国移动、腾讯、华为、微博、网易、贝壳找房、360、泰康、奈雪的茶等。

200 余位贡献者,一起缔造了 Apache APISIX 这个世界上最沉闷的开源网关我的项目。聪慧的开发者们!快来退出这个沉闷而多样化的社区,一起来给这个世界带来更多美妙的货色吧!

  • Apache APISIX GitHub:https://github.com/apache/apisix
  • Apache APISIX 官网:https://apisix.apache.org/
  • Apache APISIX 文档:https://apisix.apache.org/zh/…
退出移动版