全部文档
文档中心先胜云平台单点登录功能介绍用户同步

用户同步

标准 SSO 用户同步建议直接调用 SSO 同步接口,不要先在企业/空间用户管理中手动新增或导入用户。


调用后,平台会同时写入账号中心库中的两张表:

  • sso_user_info:记录 SSO 用户

  • user_info:记录企业/空间用户

两张表通过 user_id 关联;只有两张表都存在同一 user_id 的记录,SSO 登录链路才完整可用。

关键约束:直接同步 SSO 用户后,sso_user_infouser_info 会生成相同 user_id 的账户,但 user_info 不会自动同步用户名、手机号、邮箱等资料字段。

因此,如需在企业/空间侧补齐用户名、手机号、邮箱等信息,必须以 SSO 用户的 user_id 作为唯一标识,再调更新接口写入 user_info

标准 SSO 相关接口:

接口 1:SSO 用户同步

  • 地址:POST /system-account-api/s/oauth/sso/synchronize/user

参数名

位置

必填

说明

enterpriseCode

body

企业编码

ssoCode

body

SSO 配置编码

channelSource

body

渠道来源,默认 system

userInfo

body

用户列表(List<Map<String,Object>>),每条至少包含当前 SSO 配置 userKey 对应的唯一字段(一般是 usernameemail

接口 2:获取 SSO 用户信息

  • 地址:POST /system-account-api/s/oauth/sso/get-sso-user-info

参数名

位置

必填

说明

corpId

body

企业编码

customId

body

第三方用户唯一标识

ssoCode

body

SSO 配置编码;传入后按指定配置过滤

定开 SSO 场景下,用户与用户组的同步方式较灵活:既可在企业、空间内手动新增或导入,也可直接调用对外接口批量写入;若数据来自外部系统,还可配置数据流读取来源数据后再调接口写入。

关键约束:同步用户请勿触发邮件激活;单点登录仅支持 启用 状态用户。

常用对外接口如下(统一前缀:/system-account-api)。

调用时 Header 需传:

Header

说明

enterprise-id

企业 ID

user

操作人用户 ID

cookie

登录会话(管理员 Cookie)

timestamp

时间戳(毫秒)

platform-code

平台编码(与 platform-secret 成对,见 authorization_info

platform-secret

企业对外调用密钥

sign

签名:MD5(timestamp + user + platform-code + platform-secret)

接口 1:导入用户

  • 地址:POST /system-account-api/s/user/import/user

参数名

位置

必填

说明

tag

body

导入策略:INCREMENT(增量)/FULL(全量)

spaceId

body

条件必填

空间 ID;与 platformCode 通常成对出现

platformCode

body

条件必填

平台编码;与 spaceId 通常成对出现

enterpriseId

body

企业 ID

sendEmail

body

是否发送邮件,默认 true;SSO 同步场景一般置为 false

data

body

用户列表(List<UserImportDTO>

data[].userTag

body

用户标识类型,表示根据哪个字段匹配并更新用户:1 用户ID / 2 用户名 / 3 手机号 / 4 邮箱

data[].userId/username/mobilePhone/email

body

条件必填

userTag 填写对应匹配值;username 必填。userIdusernamemobilePhoneemail 在平台内各自唯一

data[].status

body

状态:1 启用 / 2 禁用;SSO 同步场景一般为 1

data[].nickname/password

body

昵称、初始密码

Python 示例:

Copy
from deepfos import OPTION
from deepfos.lib.sysutils import resolve_account_api_extra_header
from deepfos.lib.sysutils import calc_account_api_signature

import requests
import time


def main(p1, p2):
    url = 'https://alpha-account.deepfos.com/system-account-api/s/user/import/user'

    enterprise_id = resolve_account_api_extra_header()['enterprise-id']
    space = OPTION.api.header['space']
    app = OPTION.api.header['app']

    timestamp = str(int(time.time() * 1000))
    platform_code = '请从相关渠道获取'
    platform_secret = '请从相关渠道获取'
    sign = calc_account_api_signature(timestamp, platform_secret, platform_code)

    header = OPTION.api.header
    header.update({
        'enterprise-id': enterprise_id,
        'timestamp': timestamp,
        'platform-code': platform_code,
        'platform-secret': platform_secret,
        'sign': sign
    })

    body = {
        "tag": "INCREMENT",
        "spaceId": space,
        "platformCode": "请从相关渠道获取",
        "sendEmail": False,
        "data": [
            {
                "userTag": "2",
                "username": "import_user1",
                "nickname": "导入用户1",
                "status": "1"
            }
        ]
    }

    response = requests.post(url, headers=header, json=body)
    return

接口 2:导入用户组

  • 地址:POST /system-account-api/s/user/import/user-group

参数名

位置

必填

说明

tag

body

导入策略:INCREMENT / FULL

spaceId

body

空间 ID(用户组导入不支持企业级无空间导入)

platformCode

body

条件必填

平台编码

data

body

用户组列表(List<UserGroupImportDTO>

data[].groupName

body

用户组名称

data[].groupCode

body

用户组编码

data[].groupId

body

用户组 ID(外部已有时可传)

data[].description

body

用户组描述

Python 示例:

Copy
from deepfos import OPTION
from deepfos.lib.sysutils import resolve_account_api_extra_header
from deepfos.lib.sysutils import calc_account_api_signature

import requests
import time
import uuid


def main(p1, p2):
    url = 'https://alpha-account.deepfos.com/system-account-api/s/user/import/user-group'

    enterprise_id = resolve_account_api_extra_header()['enterprise-id']
    space = OPTION.api.header['space']
    app = OPTION.api.header['app']

    timestamp = str(int(time.time() * 1000))
    platform_code = '请从相关渠道获取'
    platform_secret = '请从相关渠道获取'
    sign = calc_account_api_signature(timestamp, platform_secret, platform_code)

    header = OPTION.api.header
    header.update({
        'enterprise-id': enterprise_id,
        'timestamp': timestamp,
        'platform-code': platform_code,
        'platform-secret': platform_secret,
        'sign': sign
    })

    body = {
        "tag": "INCREMENT",
        "spaceId": space,
        "platformCode": "请从相关渠道获取",
        "data": [
            {
                "groupId": str(uuid.uuid4()),
                "groupCode": "import_group1",
                "groupName": "导入用户组1",
                "description": "测试_导入用户组1"
            }
        ]
    }

    response = requests.post(url, headers=header, json=body)
    return

接口 3:更新用户与用户组关系

  • 地址:POST /system-account-api/s/user/import/userGroupUser

用于维护「用户 ↔ 用户组」及「父用户组 ↔ 子用户组」关系。SSO 场景下将用户加入某用户组时,一般使用 importTag=1 的记录。

参数名

位置

必填

说明

tag

body

导入策略:INCREMENT(增量)/FULL(全量)

spaceId

body

空间 ID(不支持仅企业级导入)

platformCode

body

条件必填

平台编码;与 spaceId 通常成对出现

enterpriseId

body

企业 ID

data

body

关系列表(List<UserGroupRelationshipDTO>

data[].importTag

body

关系类型:1 用户加入用户组 / 2 子用户组挂到父用户组

data[].groupCode

body

父用户组编码(须为同空间已存在的用户组,如接口 2 导入时的 groupCode

data[].groupName

body

用户组名称(可选,便于核对)

data[].userTag

body

条件必填

importTag=1 时必填,表示按哪个字段匹配用户:1 用户ID / 2 用户名 / 3 手机号 / 4 邮箱

data[].userId/username/mobilePhone/email

body

条件必填

importTag=1 时,与 userTag 对应的用户唯一值

data[].childrenGroupCode

body

条件必填

importTag=2 时必填,子用户组编码

data[].childrenGroupName

body

子用户组名称(可选)

Python 示例:

Copy
from deepfos import OPTION
from deepfos.lib.sysutils import resolve_account_api_extra_header
from deepfos.lib.sysutils import calc_account_api_signature

import requests
import time


def main(p1, p2):
    url = 'https://alpha-account.deepfos.com/system-account-api/s/user/import/userGroupUser'

    enterprise_id = resolve_account_api_extra_header()['enterprise-id']
    space = OPTION.api.header['space']
    app = OPTION.api.header['app']

    timestamp = str(int(time.time() * 1000))
    platform_code = '请从相关渠道获取'
    platform_secret = '请从相关渠道获取'
    sign = calc_account_api_signature(timestamp, platform_secret, platform_code)

    header = OPTION.api.header
    header.update({
        'enterprise-id': enterprise_id,
        'timestamp': timestamp,
        'platform-code': platform_code,
        'platform-secret': platform_secret,
        'sign': sign
    })

    body = {
        "tag": "INCREMENT",
        "spaceId": space,
        "platformCode": "请从相关渠道获取",
        "data": [
            {
                "importTag": "1",
                "groupCode": "import_group1",
                "userTag": "2",
                "username": "import_user1"
            },
            {
                "importTag": "2",
                "groupCode": "import_group1",
                "childrenGroupCode": "import_group2",
            }
        ]
    }

    response = requests.post(url, headers=header, json=body)
    return

回到顶部

咨询热线

400-821-9199

我们使用 ChatGPT,基于文档中心的内容以及对话上下文回答您的问题。

ctrl+Enter to send