写点什么

观测云集成 Lark SSO 最佳实践

作者:观测云
  • 2024-12-02
    上海
  • 本文字数:3528 字

    阅读完需:约 12 分钟

观测云集成 Lark SSO 最佳实践

介绍

Lark 官方整体对接流程

Lark 流程获取说明

获取 code

接口文档:获取登录授权码code

获取 user_access_token

接口文档:获取 user_access_token

获取用户身份信息

接口文档:获取用户身份信息

刷新 user_access_token

接口文档:刷新 user_access_token

准备

验证环境准备

  • 部署版本观测云


官方文档:https://docs.guance.com/deployment/


  • 安装 Dataflux Func 平台


官方文档:https://func.guance.com/doc/maintenance-guide-helm/


  • 观测云 OIDC 集成对接官方指引


官方文档:https://docs.guance.com/deployment/oidc-custom-url/

Lark 开放平台配置

Lark 应用配置需要访问开发后台新增应用管理配置

Lark - 测试应用信息


Lark - 安全访问配置

  • (必须)需要根据添加 redirect_uri 的回调地址




  • (按需)IP 白名单设置


Lark - 应用权限配置

SSO 身份验证需要对应用开放用户信息的相关权限



观测云平台配置

打开 部署版本「launcher」 访问页面,点击「设置」 -- 「修改应用配置」。



在 「 forethought-webclient」命名空间 的「frontNginx」中,追加访问路由。


        location /oidc/login {            proxy_connect_timeout 5;            proxy_send_timeout 5;            proxy_read_timeout 300;            proxy_http_version 1.1;            proxy_set_header Connection "keep-alive";            add_header Access-Control-Allow-Origin *;            add_header Access-Control-Allow-Headers X-Requested-With;            add_header Access-Control-Allow-Methods GET,POST,OPTIONS;            proxy_pass http://inner.forethought-core:5000/api/v1/inner/oidc/login;        }
location /oidc/callback { proxy_connect_timeout 5; proxy_send_timeout 5; proxy_read_timeout 300; proxy_http_version 1.1; proxy_set_header Connection "keep-alive"; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; proxy_pass http://inner.forethought-core:5000/api/v1/inner/oidc/callback; }
复制代码



在 「forethought-core」 命名空间中 「core」添加 OIDC 配置。


 OIDCClientSet:  # OIDC Endpoints 配置地址,即完整的 `https://xxx.xxx.com/xx/.well-known/openid-configuration` 地址.  wellKnowURL: "http://func-server.func:8088/api/v1/sync/auln-well-know"  # 由认证服务提供的 客户端ID  clientId: cli_xxxxxxxx. # 修改为您的应用 clientId  # 客户端的 Secret key  clientSecret: IDGgZxxxxxxxxxd  # 修改为您的应用 clientSecret  scope: ""  mapping:    # 认证服务中,登录账号的用户名,必填,如果值不存在,则取 email    username: name    name: name    # 认证服务中,登录账号的邮箱,必填    email: email    # 认证服务中,登录账号的唯一标识, 必填    exterId: user_id
复制代码



修改完成后, 勾选「修改配置后自动重启相关服务」后点击「确认修改配置」。

开发

Lark-SSO 对接代码部分会在独立 func 上进行集成开发。


  • 使用 Dataflux Func 同步 API 的方式 封装 OIDC 的接口,提供观测云主平台交互调用

  • Dataflux Func 「同步 API」 的使用可参考:https://func.guance.com/doc/ui-guide-management-module-sync-api/


代码说明

Oauth2.0 服务发现接口

  • 与观测云底座交互的主要集成接口


import jsonimport requests


@DFF.API('OIDC服务发现接口')def well_know(): ''' ''' print("--------turn_token--------------") # print(f"--------kwargs--------------\n{kwargs}\n") headers = _DFF_HTTP_REQUEST.get("headers", {}) print(json.dumps(_DFF_HTTP_REQUEST)) # print(json.dumps(kwargs)) result = { # 这个地址提供原始的 获取登录认证 code 地址 "authorization_endpoint":"https://open.larksuite.com/open-apis/authen/v1/authorize", # code 换 token 接口,此地址需要指向 func 侧对应的 turn_token 函数地址 # "token_endpoint":"https://gc-func.anta.com/api/v1/al/auln-get-user-token/simplified", "token_endpoint":"http://func-server.func:8088/api/v1/sync/auln-get-user-token/simplified", # 获取用户信息接口,此地址需要指向 func 侧对应的 turn_userinfo 函数地址 "userinfo_endpoint":"http://func-server.func:8088/api/v1/sync/auln-get-user-info/simplified", }
return result
复制代码

获取用户 token 接口

  • 根据 app_id 及 app_secret 获取 tenant_access_token

  • 根据 tenant_access_token 及 用户 access_code 获取 access_token


import jsonimport requests



@DFF.API('获取tenant_access_token接口')def get_tenant_access_token(): ''' 获取访问 token 信息 ''' # print(json.dumps(_DFF_HTTP_REQUEST)) # print(json.dumps(kwargs)) new_headers = { "Content-Type": "application/json; charset=utf-8" } url = "https://open.larksuite.com/open-apis/auth/v3/tenant_access_token/internal" param = { # 替换成 对应的 app_id 及 app_secret "app_id": "cli_xxxxxx", "app_secret": "IDxxxxxx", } resp = requests.post(url, json=param) print("========get_tenant_access_token==resp==========") print(resp.text) # if resp.status_code >= 400: # raise Exception("获取 token 失败") result = json.loads(resp.text) print("========get_tenant_access_token==result==========") tenant_access_token = result["tenant_access_token"]
return tenant_access_token


@DFF.API('获取用户token接口')def turn_token(**kwargs): ''' 获取访问 token 信息 ''' print("--------turn_token--------------") print(f"--------kwargs--------------\n{kwargs}\n") headers = _DFF_HTTP_REQUEST.get("headers", {}) print(json.dumps(_DFF_HTTP_REQUEST)) print(json.dumps(kwargs)) tenant_access_token = get_tenant_access_token() new_headers = { "content-type": headers.get("content-type"), "authorization": f'Bearer {tenant_access_token}' } url = "https://open.larksuite.com/open-apis/authen/v1/oidc/access_token" resp = requests.post(url, data=kwargs, headers=new_headers) print("==========resp==========") print(resp.text) if resp.status_code >= 400: raise Exception("获取 token 失败") result = resp.json() print("==========result==========") print(json.dumps(result)) return result["data"]
复制代码

获取用户信息接口

  • 根据 用户 access_token 获取用户信息


注意:此处获取的用户信息,需要确保《Lark - 应用权限配置 》配置正常,否则会无法获取相关的用户信息。


import jsonimport requests
@DFF.API('用户信息获取接口')def turn_userinfo(**kwargs): ''' Test hello world function ''' url = "https://open.larksuite.com/open-apis/authen/v1/user_info" print("--------turn_userinfo--------------") headers = _DFF_HTTP_REQUEST.get("headers", {}) print(json.dumps(_DFF_HTTP_REQUEST)) print(json.dumps(kwargs)) new_headers = { "content-type": headers.get("content-type"), "authorization": headers.get("authorization") } resp = requests.get(url, headers=new_headers) print("==========resp==========") print(resp.text) if resp.status_code >= 400: raise Exception("获取 用户信息 失败") result = resp.json() print("==========result==========") print(json.dumps(result))
result = result.get("data", {}) return result
复制代码

效果

  • 访问观测云主页面,重定向至 Lark 登录访问页面,支持手机号、邮箱、扫码登录,以邮箱访问为例



  • 通过邮箱进行登录访问,跳转应用授权页面



  • 确认授权后,会在管理后台中创建 对应人员账号



  • 将人员添加到对应空间后,重新登录后,可直接跳转至对应空间



用户头像

观测云

关注

还未添加个人签名 2021-02-08 加入

云时代的系统可观测平台

评论

发布
暂无评论
观测云集成 Lark SSO 最佳实践_SSO_观测云_InfoQ写作社区