共计 5758 个字符,预计需要花费 15 分钟才能阅读完成。
本文介绍了 Apache APISIX 如何与 Hydra 集成实现集中式身份认证。
背景介绍
Apache APISIX
Apache APISIX 是一个开源的云原生 API 网关,作为 API 网关,它兼具动静、实时、高性能等特点,提供了负载平衡、动静上游、灰度公布、服务熔断、身份认证、可观测性等丰盛的流量治理性能。你能够应用 APISIX 来解决传统的南北向流量,以及服务间的东西向流量,也能够当做 K8s Ingress controller 来应用。
APISIX 的 OpenID Connect 插件反对 OpenID Connect 协定,用户能够应用该插件让 APISIX 对接泛滥鉴权服务提供商,作为集中式认证网关部署于企业中。
Hydra
Ory Hydra 是反对 OAuth 2.0 和 OpenID Connect 协定的身份提供商之一,基于 OAuth 2.0 受权框架以及 Open ID Connect Core 1.0 框架实现,兼具开源与云原生个性。它能够与任何登录系统集成,通过 OAuth 2.0 Acces、Refresh 和 ID Tokens,使得第三方可能轻松拜访你的 API,实现用户随时随地与任何应用程序的交互。
Ory Hydra 采纳 Go 语言编写,为简直所有语言都提供了 SDK,包含 Dart、.NET、Go、Java、PHP、Python、Ruby、Rust 和 Typescript。它实用于任何登录零碎,并且能够轻松自定义登录体验。
简介
OpenID 是一种集中认证模式,它是一个去中心化的身份认证零碎。应用 OpenID 的益处是,用户只须要在一个 OpenID 身份提供方的网站上注册和登录,应用一份账户明码信息即可拜访不同利用。
通过 APISIX 反对的 openid-connect
插件,能够与反对 OpenID Connect 协定的认证程序集成。比方 Ory Hydra。
Ory Hydra 的最大劣势之一是:它实现了 OAuth 和 OpenID Connect 规范,而不是强制你应用“Hydra 用户治理”(登录、登记、配置文件治理、注册)、特定模板引擎或者预约义的前端。
它容许应用你的程序所需的身份验证机制(基于令牌的 2FA、SMS 2FA 等),并且在你的技术堆栈中实现用户治理和登录。当然你也能够应用现有的解决方案,例如 authboss。它为你提供 OAuth 2.0 和 OpenID Connect 的所有劣势性能,同时对业务逻辑和技术堆栈的侵入性最小。
OAuth 2.0 实用于多种环境和多用途场景。以下信息可能会帮忙你确定 OAuth 2.0 和 Hydra 是否适宜某个用例:https://www.ory.sh/docs/hydra
- 容许第三方的合作方拜访你的 API。
- 成为像 Google、Facebook 或 Microsoft 这样的身份提供者。
- 使浏览器、挪动设施或可穿戴应用程序可能拜访你的 API:运行 OAuth2 提供程序能够很好地实现这一点。你不用在设施上存储明码,并且能够随时撤销拜访令牌。
- 想限度后端服务能够互相读取的信息类型。例如,只容许评论服务获取用户配置文件更新,但不能读取用户明码。
如何操作
接下来,将应用实在示例为你展现 APISIX 如何与 Hydra 集成。在该示例中将应用 Docker 运行所需的环境,请在执行本操作前装置实现 Docker。
步骤一:创立并运行数据库
为了疾速部署测试环境,咱们将应用 Docker 运行 PostgreSQL 作为 Hydra 的数据库。倡议不要在生产环境应用 Docker 运行数据库。
docker network create hydraguide && \
docker run \
--network hydraguide \
--name ory-hydra-example--postgres \
-e POSTGRES_USER=hydra \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=hydra \
-d postgres:9.6
上述命令将创立一个名称为 hydraguide
的网络,并且启动一个名称为 ory-hydra-example--postgres
的 Postgres 实例,该实例创立了数据库 hydra
,用户hydra
和用户明码secret
。
步骤二:部署 Hydra
该步骤中会别离将 4444
和 4445
映射到 5444
和 5445
端口,请确保这些端口未被占用。
- 零碎密钥只能针对新数据库设置,不反对密钥轮换。此密钥用于加密数据库,每次过程(从新)启动时都须要设置为雷同的值。你能够应用
/dev/urandom
生成密钥。但请确保在你定义它的时候,该密钥都必须雷同。例如,你能够将值存储在某处:
export SECRETS_SYSTEM=$(export LC_CTYPE=C; cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
通过配置环境变量,设置 Hydra 的数据库 URL 指向 Postgres 实例。
export DSN=postgres://hydra:secret@ory-hydra-example--postgres:5432/hydra?sslmode=disable
- Ory Hydra 没有主动迁徙 SQL,因而你须要手动执行迁徙数据库的操作。
docker pull oryd/hydra:v1.10.6 && \
docker run -it --rm \
--network hydraguide \
oryd/hydra:v1.10.6 \
migrate sql --yes $DSN
- 通过以下命令运行 Hydra 服务器。更多信息,请参考 deploy-ory-hydra。
docker run -d \
--name ory-hydra-example--hydra \
--network hydraguide \
-p 5444:4444 \
-p 5445:4445 \
-e SECRETS_SYSTEM=$SECRETS_SYSTEM \
-e DSN=$DSN \
-e URLS_SELF_ISSUER=https://localhost:5444/ \
-e URLS_CONSENT=http://localhost:9020/consent \
-e URLS_LOGIN=http://localhost:9020/login \
oryd/hydra:v1.10.6 serve all
你能够应用如下命令查看 Hydra 的日志。如果你未指定 Hydra 的明码,能够在日志中查到相干信息,否则将无奈重新启动 Hydra。
docker logs ory-hydra-example--hydra
你也能够应用以下命令查看 Hydra 相干介绍及操作命令。
docker run -it --rm --entrypoint hydra oryd/hydra:v1.10.6 help serve
步骤三:部署登录和验证程序
Login Provider 和 Consent Provider 能够是两个独立的 Web 服务。Hydra 提供了示例程序,它在一个应用程序中联合了这两个性能。接下来。咱们将应用 Docker 部署该应用程序。
docker pull oryd/hydra-login-consent-node:v1.10.6 && \
docker run -d \
--name ory-hydra-example--consent \
-p 9020:3000 \
--network hydraguide \
-e HYDRA_ADMIN_URL=https://ory-hydra-example--hydra:4445 \
-e NODE_TLS_REJECT_UNAUTHORIZED=0 \
oryd/hydra-login-consent-node:v1.10.6
你能够应用以下命令检查程序是否运行失常:
docker logs ory-hydra-example--consent
失常返回后果:
> hydra-login-consent-logout@0.0.0 serve /usr/src/app
> node lib/app.js
Listening on http://0.0.0.0:3000
步骤四:执行 OAuth 2.0 受权代码流程
Hydra 反对通过 CLI 设置 OAuth 2.0 使用者和 OAuth 2.0 回调 URL 的性能,个别状况下,这是一个申请拜访服务器上的用户资源的第三方应用程序。
配置 APISIX openid-connect
插件时须要提供这些信息:
id
对应的是下述路由中插件配置的client_id
。secret
对应的是下述路由中插件配置的client_secret
。scope
对应的是下述路由中插件配置的scope
。
docker run --rm -it \
-e HYDRA_ADMIN_URL=https://ory-hydra-example--hydra:4445 \
-- network hydraguide \
oryd/hydra:v1.10.6 \
clients create --skip-tls-verify \
--id facebook-photo-backup \
--secret some-secret \
--grant-types authorization_code,refresh_token,client_credentials,implicit \
--response-types token,code,id_token \
--scope openid,offline,photos.read \
--callbacks http://127.0.0.1:9010/callback
以下示例将执行一个 OAuth 2.0 受权流程。为简化此操作,Hydra CLI 提供了一个名为 hydra token user
的辅助命令。
docker run --rm -it \
--network hydraguide \
-p 9010:9010 \
oryd/hydra:v1.10.6 \
token user --skip-tls-verify \
--port 9010 \
--auth-url https://localhost:5444/oauth2/auth \
--token-url https://localhost:5444/oauth2/token \
--client-id facebook-photo-backup \
--client-secret some-secret \
--scope openid,offline,photos.read
返回后果如下则示意配置失常:
Setting up home route on http://127.0.0.1:9010/
Setting up callback listener on http://127.0.0.1:9010/callback
Press ctrl + c on Linux / Windows or cmd + c on OSX to end the process.
If your browser doesn't open automatically, navigate to:
http://127.0.0.1:9010/
该步骤实现后将会启动一个用户登录程序,咱们将在下一步骤中应用该程序。
步骤五:启动 APISIX 并配置路由
如果你还没有装置 APISIX,请参考:装置 APISIX。
装置实现后,仅需创立路由并配置 openid-connect
插件即可。为了更直观地验证成果,咱们还须要启动了一个 NGINX 服务当做上游,你也能够应用已有的上游服务。
留神:本示例中的 APISIX 是装置在宿主机上,如果是应用 Docker 启动的 APISIX,可能会呈现网络问题。
- 首先应用 Docker 创立一个 NGINX 上游。
docker run -d --name test-nginx -p 8083:80 nginx
- 通过以下命令创立路由,并配置
openid-connect
插件。
其中 client_id
和 client_secret
和 scope
是步骤四中设置的 ID。你能够参考 Preparing for Production 获取其余信息。从上述页面,咱们能够看到 discovery
的地址为 https://{IP:Port}/.well-known/openid-configuration
。
curl http://127.0.0.1:9080/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"uri":"/*","plugins":{"openid-connect":{"client_id":"facebook-photo-backup","client_secret":"some-secret","discovery":"https://127.0.0.1:5444/.well-known/openid-configuration","scope":"openid","token_endpoint_auth_method":"client_secret_basic","bearer_only": false,"redirect_uri":"http://127.0.0.1:9080/callback"}
},
"upstream":{
"type":"roundrobin",
"nodes":{"127.0.0.1:8083":1}
}
}'
步骤六:拜访 APISIX
- 在浏览器中输出 http://127.0.0.1:9080/index.html,因为曾经开启了
openid-connect
插件,所以页面被重定向到登录页面。输出用户验证程序中默认的账号密码。
- 抉择认证协定,并容许拜访。
- 登录胜利之后,就能够拜访到上游服务的页面。
总结
本文次要介绍了 Hydra 如何与 APISIX 进行集成以及 Hydra 的利用场景。你只须要在服务器上安装 Hydra 相干的程序,就能够间接应用它作为你的身份认证程序。这种认证形式能够缩小学习和保护老本,也为用户提供了平安和精简的体验。
参考:
https://www.ory.sh/docs/hydra…
https://www.ory.sh/docs/hydra…
https://www.ory.sh/docs/hydra…
https://www.ory.sh/docs/hydra…