免费注册,打造高效身份管理
博客/开发者/技术干货 | Traefik 结合 Authing 实现集中式身份认证管理
技术干货 | Traefik 结合 Authing 实现集中式身份认证管理
Authing 官方2022.06.01阅读 1766
Authing 应用集成网关赋予老旧应用快速集成 Authing 身份云产品的能力。在扩充身份认证方式的同时,保护原有系统资源免受非法侵害。
通过 Authing 集成 Traefik(一个开源的可以使得服务发布变得轻松有趣的边缘路由器)实现单点登录,解决身份管理混乱,节省企业用户数据跨应用管理成本和信息维护成本。
01
项目介绍

关于 Authing

Authing 是国内首款以开发者为中心的全场景身份云产品,集成了所有主流身份认证协议,为企业和开发者提供完善安全的用户认证和访问管理服务。以「API First」作为产品基石,把身份领域所有常用功能都进行了模块化的封装,通过全场景编程语言 SDK 将所有能力 API 化提供给开发者。同时,用户可以灵活地使用 Authing 开放的 RESTful APIs 进行功能拓展,满足不同企业不同业务场景下的身份管理需求。

关于 Traefik

Traefik 是一个开源的可以使得服务发布变得轻松有趣的边缘路由器。它负责接收你系统的请求,然后使用合适的组件来对这些请求进行处理。
除了众多功能之外,Traefik 与众不同之处还在于它会自动发现适合你服务的配置。当 Traefik 在检查你的服务时,会找到服务的相关信息并找到合适的服务来满足对应的请求。

Traefik 兼容所有主流的集群技术,比如 Kubernetes,Docker,Docker Swarm,AWS,Mesos,Marathon 等等;并且可以同时处理多种方式(甚至可以用于在裸机上运行的比较旧的软件)。
使用 Traefik,不需要维护或者同步一个独立的配置文件:因为一切都会自动配置,实时操作的(无需重新启动,不会中断连接)。使用 Traefik,你可以花更多的时间在系统的开发和新功能上面,而不是在配置和维护工作状态上面花费大量时间。

02
什么是集中式身份认证?

传统身份认证

在传统认证模式下,各个后端应用服务需要单独开发功能以支持身份认证功能,例如与身份提供商进行交互、获取用户的身份信息等功能。

集中式身份认证

Image
与传统认证模式不同,集中身份认证模式把用户认证从应用服务中抽离了出来。
以 Traefik 为例,集中认证的流程如上图所示:首先由用户发起请求(request),然后由前置的网关负责用户认证流程,与身份提供方对接,向身份提供方发送身份认证(authorization)请求。身份提供方返回用户身份信息(user info)。网关完成用户身份识别后,将用户身份信息通过请求头的形式转发至后端应用。

集中式身份认证管理的优点

相比较传统认证模式,集中认证模式下有如下优点:
  • 简化应用开发流程,降低开发应用工作量和维护成本,避免各个应用重复开发身份认证逻辑。
  • 提高业务的安全性,集中身份认证模式在网关层面能够及时拦截未经身份认证的请求,保护后端的应用。
同时结合 Authing 强大的身份认证管理功能,可实现如下功能:
  • 通过控制台对身份认证服务进行生命周期管理,包括创建、启用、禁用等。
  • 提供实时、可视化的应用监控,包括:接口请求次数、接口调用延迟和接口错误信息,并且进行实时告警通知。集中式日志,可以方便地查看用户登录、登出以及对应用的调整和修改信息。
更多具体内容,请参考:Authing 应用集成网关
03
配置方法
  1. 单击“创建”,创建一个 Authing 应用。

  1. 设置登录 URL 和应用名称,下边以 traefik 为例。Image

  1. 设置登录回调 URL。

在认证过程中,Authing 将会拒绝除配置以外的回调 URL,traefik-forward-auth 中间件默认会回调到 _oauth 路由下,然后我接下来的示例中会使用 whoami.localhost 这个域名作为我的应用域名,所以这里配置 http://whoami.localhost/_oauth 登录回调 URL 可以配置多个,中间用英文逗号分隔。

  1. Traefik 需要更改授权配置 id_token 签名算法 RS256 点击保存。

Image
  1. 创建用户(可选)。在用户列表页面,创建用户,账号密码分别为 user1/user1,并且可以在「用户信息-授权管理」页面中设置是否允许应用的访问(默认为允许)。

  1. 访问应用页面,获取以下配置,配置 Traefik OpenID Connect 时需要提供这些信息:

  • App ID:OIDC client ID,即应用的 ID。与下文的{PROVIDERS_OIDC_CLIENT_ID} 对应。
  • App secret:OIDC client secret,即应用密钥。与下文{PROVIDERS_OIDC_CLIENT_SECRET} 对应。
  • Issuer:OIDC Issuer。与下文的 {PROVIDERS_OIDC_ISSUER_URL} 对应。
Image

安装 Docker 和 Docker Compose

如果你已经安装了 Docker 和 Docker Compose,可以跳过此步骤。详细安装步骤请见Install Docker Engine | Docker Documentation (opens new window)和 Install Docker Compose | Docker Documentation (opens new window)
如果你受限于国内服务器缓慢的网速,并且使用的是 Ubuntu 服务器,我们提供了以下方式安装 Docker 和 Docker Compose 的方式:
apt update
apt install -y unzip
wget https://download.authing.cn/docker.zip
unzip docker.zip
cd docker
sudo dpkg -i docker-ce-cli_19.03.9_3-0_ubuntu-focal_amd64.deb
sudo dpkg -i containerd.io_1.3.7-1_amd64.deb
sudo dpkg -i docker-ce_19.03.9_3-0_ubuntu-focal_amd64.deb
最后使用 docker ps 检验安装是否成功。
wget https://download.authing.cn/docker-compose-Linux-x86_64
mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
最后使用 docker-compose -v 检验安装是否成功。

安装 Traefik

1. 创建 traefik 目录 :

mkdir traefik

2. 创建一个文件:docker-compose.yaml

version: '3'

# docker 通讯  如果启动报错 提示找不到 应用@docker
# 执行命令 docker network create traefik
networks:
  traefik:
    external: true

services:
  traefik:
    image: traefik:v2.2
    # 开启 web UI 并且告诉 Traefik 监听 Docker
    command: --api.insecure=true --providers.docker
    # 端口映射  这个 80 端口 是网关入口 比如下边的 whoami 服务
    # 给他分配的域名是 whoami.localhost 那么直接访问 http://whoami.localhost 就可以
    # 如果这里分配的是 8081 之类的其下方的应用都需要带端口比如 http://whoami.localhost:8081
    # 8086 是 traefik web UI 地址
    ports:
      - '80:80'
      - '8086:8080'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik

  whoami:
    image: containous/whoami
    labels:
      # routers. 后边跟的是 services 的名称 rule 是给当前应用绑定域名或者路径
      # 每个 Host 需要配置到 Authing 的 Traefik External URL 参数中,有多个服务的时候用英文逗号分开。
      - 'traefik.http.routers.whoami.rule=Host(`whoami.localhost`)'
      # 中间件使用 traefik-forward-auth 
      - 'traefik.http.routers.whoami.middlewares=traefik-forward-auth'
    networks:
      - traefik

  traefik-forward-auth:
    image: thomseddon/traefik-forward-auth:2
    ports:
      - '4181:4181'
    networks:
      - traefik
    environment:
      # 登录方式 OIDC 下边三个参数授权等信息在 Authing 应用登录配置中 见下方图
      - DEFAULT_PROVIDER=oidc
      - PROVIDERS_OIDC_ISSUER_URL= {PROVIDERS_OIDC_ISSUER_URL}
      - PROVIDERS_OIDC_CLIENT_ID= {PROVIDERS_OIDC_CLIENT_ID}
      - PROVIDERS_OIDC_CLIENT_SECRET= {PROVIDERS_OIDC_CLIENT_SECRET}
      # 更多参数见附录1
      - SECRET=something-random
      # INSECURE_COOKIE is required if not using a https entrypoint
      - INSECURE_COOKIE=true
      - LOG_LEVEL=debug
    labels:
      # address=http://traefik-forward-auth:4181  指的是 traefik-forward-auth 应用的 4181 端口
      # 选项定义外部身份验证服务器地址
      # authResponseHeaders选项定义要从外部身份验证服务器复制到请求的标头列表
      # trustForwardHeader选项设置true表示信任所有现有的X-Forwarded-*标头
      # 更多参数见附录1
      - 'traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181'
      - 'traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User'
      - 'traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181'
最后使用 docker-compose up -d 启动 Traefik。

traefik-forward-auth

traefik-forward-auth 是 Traefik 的一个中间件,在配置后在访问 Traefik 下边应用时会先去执行中间件服务,traefik-forward-auth 会根据配置去调用 OIDC 协议登录,详情请点击traefik-forward-auth Github
04
Q & A

如何给一个服务配置多个域名

labels:
  - "traefik.prod.frontend.rule=Host:whoami.xiange.tech"
  - "traefik.another.frontend.rule=Host:who.xiange.tech"
  - "traefik.dev.frontend.rule=Host:whoami.xiange.me"

Https 相关配置

相关链接 :https://doc.traefik.io/traefik/https/overview/
https 已经成为一个现代网站的标配,以至于当一个网站没有 https 时,某些浏览器都会把它标识为不安全。而除了安全方面,https 对网站的 SEO 也影响很多,而对于某些新型的浏览器 API,也只有在 https 下才能使用。不管怎么说,https 也成为一个网站的刚需。
而当你使用了 traefik 作为反向代理时,你可以配置 ACME 自动为域名提供证书,只需几行即可解决问题。免费的证书,当然是通过 Let's Encrypt 来解决。

ACME 配置‍‍‍‍‍‍‍‍

通过它可以很方便地自动签发证书并且自动续期,我们在 traefik.toml 中进行相关配置:
[certificatesResolvers.le.acme]
  email = "you-email"
  storage = "acme.json"

[certificatesResolvers.le.acme.tlsChallenge]
其中,storage 指存放证书的位置。

Traefik 容器配置

在配置好 traefik.toml 配置完成后,我们需要修改 traefik 容器启动的相关配置:
  1. 暴露 443 端口

  2. 挂载 acme.json,持久化证书

由于 acme.json 是一个文件,我们先在宿主机中创建它:
 touch acme.json
容器,改动配置文件如下:
reverse-proxy:
    image: traefik:v2.0
    ports:
      - "443:443"
    volumes:
      - ./traefik.toml:/etc/traefik/traefik.toml
      - ./acme.json:/acme.json
      
whoami:   
    labels:
      - traefik.http.routers.whoami.tls=true
      - traefik.http.routers.whoami.tls.certresolver=le

 

服务启动后,使用 curl 测试服务是否正常工作,我们可以看到 X-Forwarded-Proto 为 https,配置成功。
$ curl https://whoami.shanyue.tech
Hostname: c9c3cc850e2b
IP: 127.0.0.1
IP: 172.18.0.2
RemoteAddr: 172.18.0.3:35320
GET / HTTP/1.1
Host: whoami.shanyue.tech
User-Agent: curl/7.29.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 59.110.159.217
X-Forwarded-Host: whoami.shanyue.tech
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Forwarded-Server: 9d783174aca9
X-Real-Ip: 59.110.159.217

出现 oops

当前情况是你的应用地址没有在 Authing 中配置:

无限循环重定向(配置错误,手动触发鉴权地址)

需要在  traefik-forward-auth 服务下的 labels 添加:
"traefik.http.routers.traefik-forward-auth.middlewares=traefik-forward-auth"

配置成功示例

1. 访问  whoami.localhost 后,如果没有登录授权,由于已经开启了 OpenID Connect 插件,所以页面被重定向到 Authing 登录页面 (可在 Authing 控制台中 「应用-品牌化」对该页面进行定制)。
Image
2. 输入用户在 Authing 注册的账号密码,或者在步骤一中创建的用户 user1/user1 ,单击“登录”,登录 Authing 账户。
3. 登录成功之后,能成功访问到  whoami.localhost 示例应用。
4. 在 Authing 控制台中的 「审计日志-用户行为日志」中可以观察到 user1 用户在 2022.04.15 11:57:51 成功登录。
5. 重新创建一个邮箱账号并登录,可以看到邮箱已经回显出来。

 

文章作者

avatar

Authing 官方

0

文章总数

authing blog rqcode
关注 Authing 公众号
随时随地发现更多内容
authing blog rqcode
添加 Authing 小助手
加入 Authing 开发者大家庭
身份顾问在线解答
当前在线
如何打造完整的身份体系?
立即沟通
authing
添加企业微信,领取行业资料
authing
authing
下载 Authing 令牌,体验快速登录认证!
免费使用
在线咨询
电话咨询