Authing 应用集成网关赋予老旧应用快速集成 Authing 身份云产品的能力。在扩充身份认证方式的同时,保护原有系统资源免受非法侵害。 通过 Authing 集成 Traefik(一个开源的可以使得服务发布变得轻松有趣的边缘路由器)实现单点登录,解决身份管理混乱,节省企业用户数据跨应用管理成本和信息维护成本。
关于 Authing
关于 Traefik
Traefik 是一个开源的可以使得服务发布变得轻松有趣的边缘路由器。它负责接收你系统的请求,然后使用合适的组件来对这些请求进行处理。
除了众多功能之外,Traefik 与众不同之处还在于它会自动发现适合你服务的配置。当 Traefik 在检查你的服务时,会找到服务的相关信息并找到合适的服务来满足对应的请求。
Traefik 兼容所有主流的集群技术,比如 Kubernetes,Docker,Docker Swarm,AWS,Mesos,Marathon 等等;并且可以同时处理多种方式(甚至可以用于在裸机上运行的比较旧的软件)。
使用 Traefik,不需要维护或者同步一个独立的配置文件:因为一切都会自动配置,实时操作的(无需重新启动,不会中断连接)。使用 Traefik,你可以花更多的时间在系统的开发和新功能上面,而不是在配置和维护工作状态上面花费大量时间。
传统身份认证
集中式身份认证

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

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

-
设置登录回调 URL。

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

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

-
访问应用页面,获取以下配置,配置 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} 对应。


安装 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
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
安装 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'


traefik-forward-auth
如何给一个服务配置多个域名
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
已经成为一个现代网站的标配,以至于当一个网站没有 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]
Traefik 容器配置
traefik.toml
配置完成后,我们需要修改 traefik
容器启动的相关配置:-
暴露 443 端口
-
挂载 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


无限循环重定向(配置错误,手动触发鉴权地址)
"traefik.http.routers.traefik-forward-auth.middlewares=traefik-forward-auth"
配置成功示例



