钉钉开发文档

免登鉴权

更新时间: 2018-9-4

钉钉微应用后台管理员免登报错无效的ssocode?错误信息是:{"errmsg":"无效的ssocode","errcode":41007}

  1. 您的ssocode已经使用过了,仔细查一下您的log,是不是开放平台调用过这个ssocode。
  2. ssocode生成的时候,会记录是哪个企业corpid对应的ssocode (如果您是isv,那么是您的微应用所属套件企业的corpid。如果您是企业,那么corpid就是您自己企业的corpid)。所以您在获取ssocode的时候,一定要用对应企业的accesstoken来获取。

免登的正确使用方式 ?

  1. 使用dd.getAuthCode获取免登授权码。
  2. 获取code码时,如果出现domain is not secure,表示您当前的url并不包含在企业安全可信域名中。如果您是企业内部开发,确认企业下的可用微应用(不包含停用状态的)的域名是否包含你当前页面的域名。如果你是第三方应用开发,确认你当前的域名是否和企业开通提供你的微应用域名相同。
  3. 使用步骤1方法拿到的免登code调用user/getuserinfo获取用户信息。
    注意此处的逻辑!以下几点会导致出现不存在的临时授权码:
    1)获取的code有效期只有5分钟,过期失效。
    2)自己打印日志确认code是否被重复使用。
    3)如果调用user/getuserinfo的时候发生不存在的临时授权码,请确认code是否被重复使用。建议开发者使用拦截器对所有和开放平台通讯有关的请求都打印返回日志(包含请求参数、返回参数、请求时间点、请求时长),便于排查问题。
    4)通过步骤3获取到用户信息之后,E应用在域名下无法种植cookie,请用localStorage代替。存储的信息为用户标识的加密或者应用自定义的sessionId。[注意不要暴露用户明文信息,一定要加密],这样避免了同一个用户多次点击时每次都要进行免登,导致多次调用接口,造成资源浪费,请求时间变长,和较差的用户体验。
  4. 当同一个用户切换不同企业的时候,微应用首页地址添加的corpid=$CORPID$的占位符,钉钉会自动帮你替换为切换的企业的corpid。
  5. 如果同一个手机设备,被相同企业的不同用户登录,那么此时会话的信息是失效的,否则会造成身份仿冒。

URL不一致导致免登报错52013,签名校验失败?

  1. 用户后端签名使用的url地址和前端访问地址需要严格一致,包括端口号。前端部分可以用alert显示出当前的location.href,后端部分请在签名的时候打印日志。
  2. 访问通过反向代理服务器、各种NAT等场景下容易出现这种问题,如http缺省的80端口,和显式增加80的不是同一个URL。
  3. 检查确认获取的jsapiticket是否正确或者过期。jsapiticket是否有效期内重复获取导致jsapiticket被覆盖。

免登如何获取用户的userid及详细信息

  1. 获取微应用免登授权码,在前端获取code,企业微应用请参考文档:获取免登授权码,第三方应用请参考稳定 : 第三方微应用获取免登授权码
  2. 将获取到的code传回服务端。
  3. 服务端根据code获取userid,调用通过CODE换取用户身份的接口 调用接口请参考文档
    https://oapi.dingtalk.com/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE

{
    "errcode": 0,
    "errmsg": "ok",
    "userid": "USERID",
    "deviceId":"DEVICEID",
    "is_sys": true,
    "sys_level": 0|1|2
}
  1. 获取到userId,请调用https://oapi.dingtalk.com/user/get?access_token=ACCESS_TOKEN&userid=zhangsan 获取用户详情。获取access_token参考文档获取token
     注:对于第一次登陆的用户可通过以上流程操作,第一次登录后可以种植cookie,这样就无需重新获取code)

企业应用免登验证时的权限验证失败怎么解决?

  1. 服务端请求get_jsapi_ticket,将请求到的ticket和过期时间存入DB。不要每次调用都请求jsticket。否则会出现不同页面之前互相抢占覆盖jsticket的问题,导致dd.config失败!
  2. web端请求服务端,服务端计算签名,计算签名用到get_jsticket。服务端从本地取出get_jsticket的时候判断一下是否要过期了,可以提前5分钟或者10分钟。如果没过期,就直接使用,如果快过期了,那么加锁更新。[重要的话说三遍“注意加锁更新”]。
  3. 服务端计算签名传递给前端。
  4. 前端jsapi调用dd.config给钉钉。注意,JSAPI是分级别的,如果你使用的jsapi是不需要鉴权(鉴权通过dd.config来实施)的,那么是没有必要调用dd.config的。
  5. 注意,jsticket是通过accesstoken获取的,也就表示jsticket是一个企业维度的值。一个企业公用一个jsticket,而不是企业下的员工使用一个jsticket。 如果频繁调用get_jsticket,钉钉开放平台会有流控限制。
  6. 有的ISV这样理解,我做一个定时任务定时刷新jsticket不是也行吗?我们不推荐这样做。因为一个套件可能有10w家企业授权。那么这个定时任务会刷新这10w家企业的jsticket,代价太大,容易触发流控,而且这10w家企业也并不是当天都活跃的企业。所以建议按照步骤2,根据企业员工的请求,被动刷新jsticket。
  7. js鉴权要求的参数中URL不要写死,也不要一个dd.config的js文件在所有的页面中都引用这段js。因为并不是所有的页面都需要使用dd.config来jsapi鉴权,哪些页面需要鉴权,就在哪些页面上做dd.config鉴权。否则在页面加载的时候会调用很多无用的dd.config,不但效率低,而且易出错。
  8. jsapi鉴权使用dd.config的时候,传入的参数一定要和你服务端做签名的参数相同。不要服务端使用一个随机串和时间戳,但是前端通过h5传给dd.config的是另外的值。
  9. 在dd.config失败的时候,钉钉会在onerror的信息中返回签名的错误信息。一定要仔细比对错误信息,查看哪一个信息是不对的。如何比对错误信息:要求isv准备一个收集前端错误的url,当页面错误的时候把onerror的信息回传给isv的服务器,做好日志备份。同时每次签名的时候,打印出签名时使用的参数。
  10. isv要准备一个收集前端错误的url,不建议直接在页面上弹出alert,这样对用户的干扰很大。而且当发生原因7描述的问题的时候,会直接干扰很多不需要dd.config的页面。

企业微应用同个页面,多次获取免登code,签名校验能一次,并且不失效吗?

同一个页面只需要config一次。


客户端获取免登授权码的返回错误信息 “errorMessage:err meg uid is not employee for orgid, errcode:3”?

企业外部联系人不能通过免登方式登录企业微应用。