中台2.0-教育中台
    中台2.0-教育中台
    • 教育中台API-接入指南
    • 账号中心单点登录-接入指南
    • 教育中台-生成接入token实践示例
    • 教师信息类
      • 因私出国境证照持有情况
        • 根据教师id查询 因私出国境证照持有情况
        • 批量查询因私出国境证照持有情况
      • 通过教师名称或者学校名称查询教师基础信息
        POST
      • 通过教师名称搜索学校内教师详情列表
        POST
      • 通过教师ID获取老师详情V2
        POST
      • 根据姓名和手机号获取学生或者教师信息
        POST
      • 按老师id列表获取老师信息列表
        POST
      • 根据老师id获取当前学期所教班级信息
        POST
      • 根据老师id获取老师所在学校当前学期
        POST
      • 获取老师学校信息
        POST
      • 批量查询教师任教信息
        POST
      • 批量查询教师任教班级的所有家长信息
        POST
      • 获取老师所属的学校详情
        POST
      • 获取该老师当前学期的年级、学段、班级信息
        POST
      • 获取老师科目信息
        POST
      • 通过姓名查询老师详情
        POST
      • 通过学校ID分页查询教师列表(附带科目信息)
        POST
      • 通过学校ID分页查询基础教师列表
        POST
      • 通过学校ID分页获取教师信息(附带科目、学段信息)
        POST
      • 通过学生ID获取教师信息
        POST
      • 通过教师ID列表获取教师基本信息、学段、学科
        POST
      • 通过证件号查询教师任教详情
        POST
      • 通过教师ID列表获取学校信息
        POST
      • 通过教师ID获取当前学期老师学段、年级和科目信息
        POST
      • 通过教师ID获取老师详情
        POST
      • 通过班级ID或者学校ID获取班级教师列表
        POST
      • 通过班级ID获取老师列表
        POST
      • 通过证件号换取教师ID
        POST
      • 通过教师ID获取【师德信息】
        POST
      • 批量获取【师德信息】
        POST
      • 批量获取【基本信息】
        POST
      • 批量查询【教育教学(按学期)】
        POST
      • 批量查询【承担公开课情况】
        POST
      • 批量查询【学习情况】
        POST
      • 批量获取【教师荣誉奖励】
        POST
      • 批量获取【教师担任专家情况】
        POST
      • 批量获取【教师资格情况】
        POST
      • 批量获取【教师考核信息情况】
        POST
      • 批量获取【教师岗位聘任情况】
        POST
      • 批量获取【教师工作经历情况】
        POST
      • 批量获取【教师家庭信息】
        POST
      • 批量获取【教师科研成果】
        POST
    • 学校信息类
      • 根据学校ID查询【学生】数量
      • 通过学校ID查询该校【老师】数量
      • 批量获取学校下各年级或者各班级【学生】人数
      • 通过学校名称模糊搜索获取学校ID
      • 根据学校ID查询学校开设学科
      • 分页获取所有学校基础信息
      • 【不分页】获取全部学校基础信息
      • 通过学校ID或者教师ID获取学段和年级
      • (教学研专用)按老师id或学校ID 获取该学校开设学段和每个学段所对应的年级
      • 根据班级id列表获取学校、年级、教师等信息
      • 根据老师ID列表查询所在学校信息
      • 获取共同体下所有学校
      • 获取学校基础信息
      • 获取学校年级下班级信息
      • 获取学校年级信息
      • 获取班级学年学期
      • 获取老师的所属区域的所有学校ID和名称
      • 通过学校ID获取年级,班级列表
      • 分页通过学段查询学校
      • 通过教师ID获取的班级年级信息
      • 通过班级Id列表获取班级对应的年级
      • 根据学校ID查询学校详细信息
      • 通过学校名称精确搜索获取学校ID
      • 获取所有学期列表
      • 获取当前学期
      • 获取学校共同体列表
      • 批量查询学校的地区信息
      • 学校ID批量查询学校的【教师】和【学生】数量
      • 获取学校或年级或班级下【学生】人数(区分性别)
      • 通过班级ID查询【教师】人数(区分性别)
      • 通过学校ID查询【教师】人数(区分性别)
      • 通过班级IDs查询班级【教师】和【学生】人数
      • 根据地区ID查询学校列表
      • 学校ID批量查询学校的教师数量
      • 批量学校ID获取年级列表
    • 学生信息类
      • 批量证件号码查询学生列表
      • 根据学生ID列表查询所有学生基础信息
      • 换取学生明文身份证号码
      • 通过学生ID获取学生监护人
      • 根据学生ID列表查询学生信息
      • 根据学生ID查询所在学校ID和名称
      • 根据学生ID获取学生所在学校当前学期
      • 根据学生ID获取学生所在班级相关教学信息
      • 根据班级id获取学生列表
      • 根据证件号码查询学生详情
      • 通过学生ID获取学生年级、班级和学校
      • 通过班级ID列表获取所有学生
      • 通过班级ID获取学生家长信息
      • 通过班级ID获取学生家长详细信息V2
      • 批量通过班级IDs获取学生家长信息
    • 组织机构类
      • token获取个人信息
      • 通过手机号查询人员ID
      • 分页获取所有组织机构信息(包括根节点)
      • 通过机构、集团ID获取机构下学校列表
      • 通过学校ID获取管理员列表
      • 获取地区信息
      • 通过人员ID获取有权限的机构ID列表
      • 通过人员ID获取角色列表
      • 查询人员信息
      • 通过组织ID获取该组织机构下的用户列表
      • 获取教务组织机构所有用户(教师+教体局人员)
      • 获取组织树
    • 系统类接口
      • externalID转化
      • 获取中台字典及对应ID
    • 内部功能接口
      • 内部接口-教师长短ID转换和身份证号查看

    教育中台-生成接入token实践示例

    1、如何使用应用的AppKey,AppSecret生成认证字符串?(必看)#

    暂时提供Java和Go语言版本

    1.1、生成认证字符串编码参考(Go语言版本)#

    供参考使用,如有疏漏,欢迎斧正。
    
    // GetToken 生成认证字符串
    // @param	appKey	      string	 "中台下发的AppKey"
    // @param	appSecret     string	 "中台下发的AppSecret"
    // @param	host	      string	 "请求host"
    // @param	path	      string	 "请求的接口路由path"
    // @param	method	      string	 "请求method,Get/Post等"
    // @param       validTime     int        "签名有效期(秒)"
    // @return                    string 	 "最终生成的认证字符串"
    func GetToken(appKey, appSecret, host, path, method string, validTime int) string {
    	header := make(map[string]string, 0)
    	header["Host"] = host
    	canonicalRequest := GenCanonicalRequest(Request{
    		Method: method,
    		Path:   path,
    		Header: header,
    	})
    	authStringPrefix := GenAuthStringPrefix(appKey, validTime)
    	token := GenSignature(appSecret, authStringPrefix, canonicalRequest)
            
    	return authStringPrefix + "/host/" + token
    }
    
    // Request 请求参数
    type Request struct {
    	Method string
    	Path   string
    	Query  map[string]string
    	Header map[string]string
    }
    
    // URLEncode 对绝对路径进行编码
    // @param	str	string	"绝对路径"
    // @return      string 	"编码结果"
    func URLEncode(str string) string {
    	return strings.Replace(url.QueryEscape(str), "+", "%20", -1)
    }
    
    // URIEncodeExceptSlash 对绝对路径进行编码,但是不对"/"进行编码
    // @param	uri string	"绝对路径"
    // @return          string 	"编码结果"
    func URIEncodeExceptSlash(uri string) string {
    	var result string
    	for _, char := range uri {
    		str := fmt.Sprintf("%c", char)
    		if str == "/" {
    			result += str
    		} else {
    			result += URLEncode(str)
    		}
    	}
    
    	return result
    }
    
    // ToCanonicalQueryString 对URL中的Query String进行编码
    // @param	params	map	"Query String组成的map"
    // @return              string 	"编码结果"
    func ToCanonicalQueryString(params map[string]string) string {
    	if params == nil {
    		return ""
    	}
    
    	encodedQueryStrings := make([]string, 0, 10)
    	var query string
    
    	for key, value := range params {
    		if key != "" {
    			query = URLEncode(key) + "="
    			if value != "" {
    				query += URLEncode(value)
    			}
    			encodedQueryStrings = append(encodedQueryStrings, query)
    		}
    	}
    
    	sort.Strings(encodedQueryStrings)
    
    	return strings.Join(encodedQueryStrings, "&")
    }
    
    // ToCanonicalHeaderString 对请求中的Header进行选择性编码
    // @param	headerMap map	"选择的Header组成的map"
    // @return          	string 	"编码结果"
    func ToCanonicalHeaderString(headerMap map[string]string) string {
    	headers := make([]string, 0, len(headerMap))
    	for key, value := range headerMap {
    		headers = append(headers,
    			fmt.Sprintf("%s:%s", URLEncode(strings.ToLower(key)),
    				URLEncode(strings.TrimSpace(value))))
    	}
    
    	sort.Strings(headers)
    
    	return strings.Join(headers, "\n")
    }
    
    // GenCanonicalRequest 对http请求进行规范化编码
    // @param	req	Request	"http请求信息"
    // @return              string 	"编码结果"
    func GenCanonicalRequest(req Request) string {
    	md := strings.ToUpper(req.Method)
    	curi := URIEncodeExceptSlash(req.Path)
    	cqs := ToCanonicalQueryString(req.Query)
    	chs := ToCanonicalHeaderString(req.Header)
    	return md + "\n" + curi + "\n" + cqs + "\n" + chs
    }
    
    // GenAuthStringPrefix 生成前缀字符串
    // @param	accessKeyId		string	"访问密钥ID"
    // @param	expirationPeriodInSecs	int 	"签名有效期(秒)"
    // @return          			string 	"前缀字符串"
    func GenAuthStringPrefix(accessKeyId string, expirationPeriodInSecs int) string {
    	ts := time.Now().UTC().Format(time.RFC3339)
    	authStringPrefix := fmt.Sprintf("readboy-edu-middle-v2/%s/%s/%d", accessKeyId, ts, expirationPeriodInSecs)
    	return authStringPrefix
    }
    
    // GenSignature 生成签名摘要
    // @param	secretAccessKey		string	"秘密访问密钥"
    // @param	authStringPrefix	string	"前缀字符串"
    // @param	canonicalRequest	string	"规范化请求"
    // @return            			string 	"签名摘要"
    func GenSignature(secretAccessKey, authStringPrefix, canonicalRequest string) string {
    	h1 := hmac.New(sha256.New, []byte(secretAccessKey))
    	h1.Write([]byte(authStringPrefix))
    	signingKey := hex.EncodeToString(h1.Sum(nil))
    
    	h2 := hmac.New(sha256.New, []byte(signingKey))
    	h2.Write([]byte(canonicalRequest))
    	signature := hex.EncodeToString(h2.Sum(nil))
    	return signature
    }

    1.2、生成认证字符串编码参考(Java语言版本)#

    修改于 2024-07-17 06:32:14
    上一页
    账号中心单点登录-接入指南
    下一页
    根据教师id查询 因私出国境证照持有情况
    Built with