JSAPI鉴权
更新于 2024-11-18钉钉提供的JSAPI有很多是手机的基础能力,对这些JSAPI的调用不需要进行鉴权(不需要进行dd.config),只需要在dd.ready里调用。对于一些钉钉业务、安全相关的JSAPI的调用,需要先鉴权,然后再调用。
了解JSAPI是否需要鉴权,请查看H5微应用JSAPI总览。
接入必读
鉴权是针对微应用页面实现的。如果当前页面用到需要鉴权的JSAPI,此页面就需要执行鉴权流程。钉钉开放平台会获取当前页面中需要鉴权的JSAPI,然后执行鉴权。
要求开发者的签名signature值必须与开放平台的保持一致。
重要计算签名时用到的URL,必须是使用了需要鉴权的JSAPI的页面。
针对VUE单页面应用,鉴权需要对父页面实现,因为计算签名方法不支持路由页面地址。
实现流程如下,当使用了需要鉴权的子页面加载时,需要刷新父页面,使父页面完成鉴权流程,然后该子页面上就可以调用需要鉴权的JSAPI。
步骤一:获取access_token
企业内部应用可通过获取企业内部应用的access_token接口获取。
第三方企业应用可通过服务商获取第三方应用授权企业的access_token接口获取。
必须使用当前微应用的参数获取access_token,
步骤二:获取jsapi_ticket
通过获取jsapi_ticket接口获取jsapi_ticket时,请注意:
企业内部应用和第三方企业应用获取 jsapiTicket 后,如果 jsapiTicket 尚未过期,再次调用获取jsapiTicket接口时,返回的 jsapiTicket 值与之前的相同,只是续期了 2 小时。需要注意的是,从 jsapiTicket 生成起,最大过期时间为 24 小时,即使续期后,最大过期时间仍从 jsapiTicket 生成起计算。
例如:当你早上 9 点,生成一个 jsapiTicket 时,即使一直续期,第二天早上9点,jsapiTicket 也会过期,需要重新生成一个新的 jsapiTicket。
企业内部应用获取jsapi_ticket,一个appKey对应一个jsapi_ticket,所以在使用的时候需要将jsapi_ticket以appKey为维度进行缓存下来(设置缓存过期时间2小时),并不需要每次都通过接口拉取。
步骤三:获取签名参数
在前端进行鉴权之前,需要获取以下签名所需的参数:
参数 | 说明 | 开发企业内部应用 | ISV开发第三方企业应用 |
url | 当前网页的URL,不包含#及其后面部分。 说明
| — | — |
nonceStr | 自定义固定字符串。 | — | — |
agentId | 应用的标识 | 可以在开发者后台的应用详情页中获取。 | 可以从授权信息中获取到。 |
timeStamp | 时间戳 | 当前时间,但是前端和服务端进行校验时候的值要一致。 | 当前时间,但是前端和服务端进行校验时候的值要一致。 |
corpId | 企业ID | 企业的corpid,可以在开发者后台首页获取。 | 通过在页面地址上追加? |
步骤四:计算签名
在服务端通过sign(ticket
, nonceStr
, timeStamp
, url
)计算前端校验需要使用的签名信息。
示例代码:
步骤五:引入使用的JS
步骤六:JSAPI鉴权
示例代码:
dd.config中所有的参数必须直接来自服务端,不能直接在前端定义。
一个页面只需要调用一次dd.config即可,重复调用会复用第一次调用的参数,单页应用(SPA)的router切换视为同一个页面。
参数说明:
参数 | 类型 | 是否必填 | 说明 |
agentId | String | 是 | 微应用ID。 |
corpId | String | 是 | 企业的corpid。 |
timeStamp | String | 是 | 生成签名的时间戳。 |
nonceStr | String | 是 | 自定义固定字符串。 |
signature | String | 是 | JSAPI签名,可以参考简易教程中的获取签名的示例代码。 |
type | number | 否 | 如果是要调用服务窗的jsapi,请填1。 |
jsApiList | Array | 是 | 需要调用的jsapi列表。 |
步骤七:调用JSAPI
完成鉴权后,便可以在dd.ready里调用JSAPI了。
代码示例:
代码示例
企业内部应用:JSAPI权限验证配置Demo-Java版本
第三方企业应用:JSAPI权限验证配置Demo-PHP版本
前端鉴权示例:PHP版本Demo.js
常见问题
dd.config错误说明,提示“jsapi ticket读取失败”
"jsapi ticket读取失败", 这个错误是因为钉钉服务器没有成功读取到该企业的jsticket数据,原因可能为:
corpid不一致:
调用获取jsapi_ticket接口,使用的access_token对应的corpid和dd.config中传递的corpid不一致。
开发者缓存的jsticket时间过长导致jsticket已经过期。
报错提示“无效的agent_id”
需要检查appkey和agent_id所对应的应用,是否为同一个应用,必须是同一个应用下的agent_id和appkey才可以正常使用。
查看以下两项的值是否属于同一个应用。例如appkey对应的应用的agent_id为23456,b所对应的agent_id为23457,agent_id不同,可判断不是同一个应用,则会报错。
调用获取jsapi_ticket接口,使用的access_token,使用的appkey
dd.config中传递的agent_id
免登报错52013,签名校验失败
用户后端签名使用的url地址和前端访问地址需要严格一致,包括端口号。前端部分可以用alert显示出当前的location.href,后端部分请在签名的时候打印日志。
访问通过反向代理服务器、各种NAT等场景下容易出现这种问题,如http缺省的80端口,和显式增加80的不是同一个URL。
检查确认获取的jsapiticket是否正确或者过期。jsapiticket是否有效期内重复获取导致jsapiticket被覆盖。