JSAPI鉴权----钉钉H5开发

虽钉钉开发文档上写着不需要JSAPI签权,但这仅仅是针对Android手机

所以为了保险起见,在使用JSAPI前,都需要签权。

否则:dd.ready({}) 将不会执行。

JSAPI签权步骤:

  1. 获取accessToken(用于jsapi_ticket的获取)
  2. 获取jsapi_ticket(用于用于js的签名计算)
  3. 获取签名参数
  4. 生成签名
  5. 引入js
  6. dd.config({}) JSAPI签权

1.获取accessToken

请求方式:GET(HTTPS)
请求地址:https://oapi.dingtalk.com/gettoken?corpid=id&corpsecret=secret
参数说明

参数

参数类型

必须

说明

corpid

String

企业Id

corpsecret

String

企业应用的凭证密钥

返回说明:(token有效期是:7200s)

{

"errcode": 0,

"errmsg": "ok",

"access_token": "fw8ef8we8f76e6f7s8df8s"

}


2.获取jsapi_ticket

请求说明

请求方式:GET(HTTPS)
请求地址:https://oapi.dingtalk.com/get_jsapi_ticket?access_token=ACCESS_TOKEN
参数说明:

参数

参数类型

必须

说明

access_token

String

调用接口凭证

type

String

目前只支持jsapi

正确时返回示例如下:

{

"errcode": 0,

"errmsg": "ok",

"ticket": "dsf8sdf87sd7f87sd8v8ds0vs09dvu09sd8vy87dsv87",

"expires_in": 7200

}

参数

说明

errcode

错误码

errmsg

错误信息

ticket

用于JS API的临时票据

expires_in

票据过期时间

出错时返回示例如下:

{

"errcode": 45009,

"errmsg": "接口调用超过限制"

}

 


3.获取签名参数

在前端进行免登鉴权之前,我们要先拿到一些免登鉴权的参数,主要有有urlnonceStr, agentId, timeStamp, corpId 。

参数

说明

企业

ISV

url

当前网页的URL,不包含#及其后面部分

nonceStr

随机串,自己定义

agentId

应用的标识

编辑企业应用可以看到

在ISV调用get_auth_info接口里面可以获取

timeStamp

时间戳

当前时间,但是前端和服务端进行校验时候的值要一致

当前时间,但是前端和服务端进行校验时候的值要一致

corpId

企业ID

企业ID,在开发者后台中企业视图下开发者账号设置里面可以看到

通过在页面地址上追加?corpId=CORPID进行获取

注:url参数需要注意,如果url中?号后有中文参数,则参数需要进行URLDecoder.decode(“name=中&age=18”);处理


4.生成签名

在服务端通过sign(ticketnonceStrtimeStampurl)计算前端校验需要使用的签名信息。

代码展示:

public static String sign(String ticket, String nonceStr, long timeStamp, String url) throws OApiException {

String plain = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "×tamp=" + String.valueOf(timeStamp)

+ "&url=" + url;

try {

MessageDigest sha1 = MessageDigest.getInstance("SHA-1");

sha1.reset();

sha1.update(plain.getBytes("UTF-8"));

return bytesToHex(sha1.digest());

} catch (NoSuchAlgorithmException e) {

throw new OApiResultException(e.getMessage());

} catch (UnsupportedEncodingException e) {

throw new OApiResultException(e.getMessage());

}

}

//将bytes类型的数据转化为16进制类型

private static String bytesToHex(byte[] hash) {

Formatter formatter = new Formatter();

for (byte b : hash) {

formatter.format("%02x", b);

}

String result = formatter.toString();

formatter.close();

return result;

}

将:urlnonceStragentIdtimeStampcorpIdsignature传递到前端页面,在前端HTML5页面使用jsapi提供的dd.config接口进行签名校验。

封装成JSON 字符串:

"{\"jsticket\":\"" + ticket + "\",\"signature\":\"" + signature + "\",\"nonceStr\":\"" + nonceStr + "\",\"timeStamp\":\""

+ timeStamp + "\",\"corpId\":\"" + Env.CORP_ID + "\",\"agentid\":\"" + Config.agentId + "\"}"

5.引入JS

<script src="http://g.alicdn.com/dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script>

注:如果页面地址是HTTPS协议,这个js的src也必须使用HTTPS,即:

<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script>

6.JSAPI鉴权

示例代码:

dd.config({

agentId: '', // 必填,微应用ID

corpId: '',//必填,企业ID

timeStamp: , // 必填,生成签名的时间戳

nonceStr: '', // 必填,生成签名的随机串

signature: '', // 必填,签名

type:0/1,   //选填。0表示微应用的jsapi,1表示服务窗的jsapi;不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持

jsApiList : [

'runtime.info',

'biz.contact.choose',

'device.notification.confirm',

'device.notification.alert',

'device.notification.prompt',

'biz.ding.post',

'biz.util.openLink',

] // 必填,需要使用的jsapi列表,注意:不要带dd。

});

参数

参数类型

必须

说明

agentId

String

微应用ID,普通企业可以通过OA后台的微应用-设置查看agentId,点击查看。ISV需要通过调用授权成功后的get_auth_info获取授权方的agentId

corpId

String

企业ID

timeStamp

String

生成签名的时间戳

nonceStr

String

生成签名的随机串

signature

String

JS-API签名,可以参考简易教程中的获取签名的示例代码

type

number

如果是要调用服务窗的jsapi,请填1

jsApiList

Array

需要调用的jsapi列表

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

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

通过error接口处理失败验证

dd.config验证失败会执行error函数,错误信息可以在返回的error参数中参看,下面为error信息示例:

dd.error(function(error){

/**

{

errorMessage:"错误信息",// errorMessage 信息会展示出钉钉服务端生成签名使用的参数,请和您生成签名的参数作对比,找出错误的参数

errorCode: "错误码"

}

**/

alert('dd error: ' + JSON.stringify(err));

});

JSAPI签权的更多相关文章

  1. .Net Core 3.0 Api json web token 中间件签权验证和 Cors 中间件处理跨域请求

    第一步:在Nuget上安装"Microsoft.AspNet.WebApi.Cors"包,并对api controller使用[EnableCors]特性以及Microsoft.A ...

  2. 钉钉JSAPI前端鉴权

    钉钉二次开发分为如下表所示三种类型的开发,只有企业内部应用才需要对JSAPI鉴权. 类型 开发方式 JSAPI鉴权 应用场景 第三方企业应用 E应用开发 不需要 用于发布到钉钉应用市场,供广大用户下载 ...

  3. Solon rpc 之 SocketD 协议 - 消息鉴权模式

    Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...

  4. Solon rpc 之 SocketD 协议 - RPC鉴权模式

    Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...

  5. 微信小程序支付功能讲解(2)

    小程序支付 业务流程时序图 官方文档 步骤: 1. Openid 在小程序初次加载的时候就已经获取(详情见 小程序登录) 2. 生成商户订单 1.商品信息由小程序端提供 2.提供支付统一下单接口所需参 ...

  6. 钉钉企业内部H5微应用开发

    企业内部H5微应用开发 分为 服务端API和前端API的开发,主要涉及到进入应用免登流程和JSAPI鉴权. JSAPI鉴权开发步骤: 1.创建H5微应用 登入钉钉开放平台(https://open-d ...

  7. 微信小程序 - 支付(后端代码实现)

    小程序支付 业务流程时序图 官方文档 步骤: 1. Openid 在小程序初次加载的时候就已经获取(详情见 小程序登录) 2. 生成商户订单 1.商品信息由小程序端提供 2.提供支付统一下单接口所需参 ...

  8. 将 Shiro 作为应用的权限基础

    Shiro 是 Java 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势.本文介绍了 Shiro 的 ...

  9. sip常用消息实体参考(系网上摘抄,感谢分享)

    1.MESSAGE消息       1)头字段填写说明       Call-id:                 必选       CSeq:                   必选       ...

随机推荐

  1. R Data Frame

    https://www.datamentor.io/r-programming/data-frame/ Check if a variable is a data frame or not We ca ...

  2. Linux-3.14.12内存管理笔记【构建内存管理框架(1)】

    传统的计算机结构中,整个物理内存都是一条线上的,CPU访问整个内存空间所需要的时间都是相同的.这种内存结构被称之为UMA(Uniform Memory Architecture,一致存储结构).但是随 ...

  3. Ubuntu下doxygen+graphviz使用概录

    关键词:doxygen.Doxyfile.doxywizard.dot.graphviz等等. 使用doxygen从源码注释生成帮助文档或者SDK,输出格式有多种比如htmp.Latex等等. 如果想 ...

  4. layUI学习第二日:非模块化方法使用layUI

    layUI采用非模块化方式(即所有模块一次性加载),操作示例代码如下(如果问怎么创建项目和工具,参考layUI学习第一日的步骤): 运行的结果如下: 运行的显示不会太持久,过几秒就会消失,具体封装的代 ...

  5. [译]发布ABP v0.19包含Angular UI选项

    发布ABP v0.19包含Angular UI选项 ABP v0.19已发布,包含解决的~90个问题和600+次提交. 新功能 Angular UI 终于,ABP有了一个SPA UI选项,使用最新的A ...

  6. django--通过jwt获取用户信息的两种方式

    HTTP请求是无状态的,我们通常会使用cookie或session对其进行状态保持,cookie存储在客户端,容易被用户误删,安全性不高,session存储在服务端,在服务器集群情况下需要解决sess ...

  7. angularjs 一篇文章看懂自定义指令directive

     壹 ❀ 引 在angularjs开发中,指令的使用是无处无在的,我们习惯使用指令来拓展HTML:那么如何理解指令呢,你可以把它理解成在DOM元素上运行的函数,它可以帮助我们拓展DOM元素的功能.比如 ...

  8. mongodb简单监控

    一.mongodb提供了自己的监控工具 mongostat mongostat是mongodb自带的状态检测工具,在命令行下使用.它会间隔固定时间获取mongodb的当前运行状态,并输出.如果你发现数 ...

  9. JavaScript判断对象和数组

    在调用后端接口时,由于后端接口的不规范统一,接口最外层在没有数据时返回的是空数组(其实更想要的是空json对象,接口返回的data数据应该统一返回json对象,便于扩展),而在有数据时返回的是json ...

  10. 3、Hibernate的多表关联

    一.数据库中的表关系: 一对一关系 一个人对应一张身份证,一张身份证对应一个人,一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里 ...