本文介绍了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

  1. 允许第三方的合作方访问你的 API。

  2. 成为像 Google、Facebook 或 Microsoft 这样的身份提供者。

  3. 使浏览器、移动设备或可穿戴应用程序能够访问你的 API:运行 OAuth2 提供程序可以很好地实现这一点。你不必在设备上存储密码,并且可以随时撤销访问令牌。

  4. 想限制后端服务可以相互读取的信息类型。例如,只允许评论服务获取用户配置文件更新,但不能读取用户密码。

如何操作

接下来,将使用真实示例为你展示 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

该步骤中会分别将 44444445 映射到 54445445 端口,请确保这些端口未被占用。

  1. 系统密钥只能针对新数据库设置,不支持密钥轮换。 此密钥用于加密数据库,每次进程(重新)启动时都需要设置为相同的值。 你可以使用 /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
  1. 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
  1. 通过以下命令运行 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.jsListening 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,可能会出现网络问题。

  1. 首先使用 Docker 创建一个 NGINX 上游。
docker run -d --name test-nginx -p 8083:80 nginx
  1. 通过以下命令创建路由,并配置 openid-connect 插件。

其中 client_idclient_secretscope 是步骤四中设置的 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

  1. 在浏览器中输入http://127.0.0.1:9080/index.html,由于已经开启了openid-connect 插件,所以页面被重定向到登录页面。输入用户验证程序中默认的账号密码。

  1. 选择认证协议,并允许访问。

  1. 登录成功之后,就可以访问到上游服务的页面。

总结

本文主要介绍了 Hydra 如何与 APISIX 进行集成以及 Hydra 的应用场景。你只需要在服务器上安装 Hydra 相关的程序,就可以直接使用它作为你的身份认证程序。这种认证方式可以减少学习和维护成本,也为用户提供了安全和精简的体验。

参考:

https://www.ory.sh/docs/hydra/configure-deploy

https://www.ory.sh/docs/hydra/5min-tutorial

https://www.ory.sh/docs/hydra/install

https://www.ory.sh/docs/hydra/#is-ory-hydra-the-right-fit-for-you

APISIX 如何与 Hydra 集成,搭建集中认证网关助力企业安全相关推荐

  1. 阿里云EDAS满分通过可信云微服务先进级认证,助力企业低成本轻松上云

    近日,阿里云企业级分布式应用服务(EDAS)通过了可信云计算微服务解决方案评估,信通院与云计算开源产业联盟给出的认证结果是:在基础设施层.微服务框架.公共基础服务.管理控制台.性能及安全性等方面的技术 ...

  2. ONLYOFFICE如何与Moodle集成连接

    ONLYOFFICE如何与Moodle集成连接 Moodle网络教学系统 互联架构 ONLYOFFICE文档服务器安装 互联网在线版 本地私有云版 在Moodle中配置ONLYOFFICE连接器插件 ...

  3. centos7 svn集成ldap用户认证

    概述 前面,我记录了一下openldap的搭建,搭建过后,这里记录一下,如何将ldap的认证,集成到svn中.集成的办法,目前是有两种: 1. svn直接通过svn端口直接访问的,通过sasl实现ld ...

  4. 简单易学sa-token快速搭建——权限认证《一》

    快速搭建--权限认证<一> 环境搭建 全局拦截规则 功能实现(登录,注销,封禁,踢下线) 注解鉴权 拦截规则(进阶版) 补充(切换账号) 环境搭建 sa-token官网文档 redis安装 ...

  5. R如何与Tableau集成分步指南 - 适用于数据科学和商业智能专业人员

    Tableau是当今数据科学和商业智能专业人员使用的最流行的数据可视化工具之一.它使您能够以交互式和多彩的方式创建具有洞察力和影响力的可视化效果. 在本文中,我们将看到一些超越拖放功能的高级图表.我们 ...

  6. Spring+SpringMVC+Mybatis框架集成搭建教程

    一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...

  7. springboot集成mongoDB 异常认证

    springboot集成mongoDB 异常认证 参考文章: (1)springboot集成mongoDB 异常认证 (2)https://www.cnblogs.com/mh-study/p/980 ...

  8. android App 集成 facebook 第三方认证登录

    今天公司一个项目要集成第三方的认证登录,第一次做这种第三方登录,而且因为大陆访问不了 facebook,所以花了比较长的时间才实现功能.其中也有一些需要注意的地方,记录一下,也跟大家一起交流. 一.f ...

  9. 随笔:使用Windows搭建AAA认证服务器

    使用Windows搭建AAA认证服务器 前言: 一.AD域安装 1.添加角色和功能 2.添加角色和功能 3.添加角色和特征 4.服务器池选取 5.添加AD域服务,同时添加所需功能 6.根据提示操作,下 ...

最新文章

  1. 架构师成长计划”牵手百度,聚焦未来数据中心基础架构|Science x Intel
  2. sqlserver去掉密码强度验证_安装sql2008数据库引擎配置时,提示sa密码强度不满足要求怎么办?...
  3. 108.什么是信道?109.信道分类 110.什么是模拟信号?什么是数字信号?
  4. 学习笔记100—强制免费下载 百度文库等网站上文档 以及客道巴巴文档 教程
  5. Java10-day01【继承(变量-构造方法访问-成员方法 访问)、super内存图、方法重写、继承、包、import、权限修饰符、final、static】
  6. VTK:Utilities之2DArray
  7. JDK 8 新特性 之 方法引用
  8. AndroidStudio_android通过服务,检测本程序是否已经终止运行_终止运行后发送通知给Http服务器---Android原生开发工作笔记246
  9. Web API-document
  10. win7西捷硬盘测试软件,Seagate希捷SeaTools硬盘检测工具
  11. 诺顿企业版 V11.0
  12. Less系列之导入(Importing)
  13. 大家来找茬源码(微擎) -- 流量主
  14. google vr学习资料整理
  15. 梯度下降法实战案例(波士顿房价)
  16. 迷幻的 JavaScript(js) 装13代码
  17. def demo什么意思python_Python之Turtle库Demo案例
  18. 高效!中建三局携手百度智能云打造度目智慧通行解决方案
  19. Phone拨号流程(Android9.0 Phone拨号)
  20. XTTS迁移11g到19c

热门文章

  1. 基于VC++的记分板调度方法仿真
  2. 华为鸿蒙麒麟玉兔_华为鸿蒙麒麟玉兔_网传华为鸿蒙OS路线表:覆盖麒麟9000到麒麟710...
  3. 顺应云计算变革大势,腾讯云全新星星海自研服务器真正为云而生
  4. OI生涯回忆录 2017.9.10~2018.11.11
  5. 品牌对比 | 海蓝之谜 VS SK2
  6. 绅聚科技推出全球最低功耗蓝牙无线键盘方案
  7. 智慧教育将基于计算机网络,智慧教育将基于计算机网络的信息服务融入学校的各个应用与服务领域,实现互联和协作。()...
  8. 【英文原著 02】- The Lion the witch and the wardrobe
  9. Python 之MySql 每日一练 329——查询名字中含有风字的学生信息
  10. js递归函数中的执行顺序问题