• 实现集中式身份认证管理的案例


    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

    什么是集中式身份认证?

    传统身份认证

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

    集中式身份认证

    与传统认证模式不同,集中身份认证模式把用户认证从应用服务中抽离了出来。

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

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

    相比较传统认证模式,集中认证模式下有如下优点:

    • 简化应用开发流程,降低开发应用工作量和维护成本,避免各个应用重复开发身份认证逻辑。
    • 提高业务的安全性,集中身份认证模式在网关层面能够及时拦截未经身份认证的请求,保护后端的应用。

    同时结合 Authing 强大的身份认证管理功能,可实现如下功能:

    • 通过控制台对身份认证服务进行生命周期管理,包括创建、启用、禁用等。
    • 提供实时、可视化的应用监控,包括:接口请求次数、接口调用延迟和接口错误信息,并且进行实时告警通知。
    • 集中式日志,可以方便地查看用户登录、登出以及对应用的调整和修改信息。

    03

    配置方法

    1. 单击“创建”,创建一个 Authing 应用。

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

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

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

    2. 创建用户(可选)。在用户列表页面,创建用户,账号密码分别为 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} 对应。

    安装 Docker 和 Docker Compose

    如果你已经安装了 Docker 和 Docker Compose,可以跳过此步骤。

    如果你受限于国内服务器缓慢的网速,并且使用的是 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    最后使用 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
    
    • 1
    • 2
    • 3

    最后使用 docker-compose -v 检验安装是否成功。

    安装 Traefik

    1. 创建 traefik 目录 :
    mkdir traefik
    
    • 1
    1. 创建一个文件: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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    最后使用 docker-compose up -d 启动 Traefik。

    traefik-forward-auth

    traefik-forward-auth 是 Traefik 的一个中间件,在配置后在访问 Traefik 下边应用时会先去执行中间件服务,traefik-forward-auth 会根据配置去调用 OIDC 协议登录。

    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"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中,storage 指存放证书的位置。

    Traefik 容器配置

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

    挂载 acme.json,持久化证书

    由于 acme.json 是一个文件,我们先在宿主机中创建它:

     touch acme.json
    
    • 1

    容器,改动配置文件如下:

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    服务启动后,使用 curl 测试服务是否正常工作,我们可以看到 X-Forwarded-Protohttps,配置成功。

    $ 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    出现 oops

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

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

    需要在 traefik-forward-auth 服务下的 labels 添加:

    "traefik.http.routers.traefik-forward-auth.middlewares=traefik-forward-auth"
    
    • 1

    配置成功示例

    1. 访问 whoami.localhost 后,如果没有登录授权,由于已经开启了 OpenID Connect 插件,所以页面被重定向到 Authing 登录页面 (可在 Authing 控制台中 「应用-品牌化」对该页面进行定制)。

    2. 输入用户在 Authing 注册的账号密码,或者在步骤一中创建的用户 user1/user1 ,单击“登录”,登录 Authing 账户。

    3. 登录成功之后,能成功访问到 whoami.localhost 示例应用。

    4. 在 Authing 控制台中的 「审计日志-用户行为日志」中可以观察到 user1 用户在 2022.04.15 11:57:51 成功登录。

    5. 重新创建一个邮箱账号并登录,可以看到邮箱已经回显出来。

    关于 Authing

    Authing 身份云国内首款以开发者为中心的全场景身份云产品,集成了所有主流身份认证协议,为企业和开发者提供完善安全的用户认证和访问管理服务,已帮助 20,000+ 家企业和开发者构建标准化的用户身份体系。

    Authing 既是客户的支持者,也是客户的产品专家和战略顾问,更是值得信赖的合作伙伴。我们提供全球化的身份专家支持团队,通过网络或电话,7*24 小时不间断支持。Authing 的帮助中心提供最新的技术知识库、商业案例以及与您的同行和 Authing 专家联系的机会。无论您何时需要我们,Authing 的支持团队总能最快响应。

    2022 年,Authing 将秉承着致力于客户成功的初衷,帮助推动客户重要业务,为实现身份连通、打破数据孤岛而不懈努力。

    点击此处了解更多行业身份管理

    「解决方案」以及「最佳实践案例」

  • 相关阅读:
    区块链实训教程(3)--使用虚拟机安装Ubuntu
    进程的一些概念以及环境变量
    thinkphp6 入门(5)-- 模型是什么 怎么用
    电脑硬件——CPU
    BUUCTF: [极客大挑战 2019]EasySQL 1
    深入浅出InnoDB Locking
    网络爬虫中的代理技术:socks5代理和HTTP代理
    力扣刷题日记
    Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南
    SPI总线协议
  • 原文地址:https://blog.csdn.net/Authing/article/details/126030117