前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >授权需要三个角色才能完成

授权需要三个角色才能完成

原创
作者头像
艳艳代码杂货店
修改2021-09-26 09:37:58
3600
修改2021-09-26 09:37:58
举报
文章被收录于专栏:艳艳代码杂货店

授权需要三个角色才能完成:

  • 开放平台
    • 提供授权页面,引导客户完成服务商应用的授权
    • 客户完成授权后,跳转到服务商应用提供的授权回调地址同时带上授权信息
  • 客户:在开放平台提供的授权页面中,完成对服务商应用的授权
  • 服务商应用:接收开放平台回调的授权信息,完成务商应用与客户的绑定关系、保存授权信息

当然也可以使用appid + appsecret 直接认证服务商应用的身份,这种适合没有第三方的时候,数据都是属于开放平台的,跟客户没有半点关系,也就不存在需要客户授权的问题。

OAuth2授权机制

OAuth2是一套授权标准,现在互联网做授权基本都用它,如github登陆 、微信公众号授权等都是基于OAuth2的应用。

授权流程
授权流程

请求参数

请求参数分两类:系统参数业务参数

  • 系统参数:每次API调用都必需携带的参数
  • 业务参数:开放平台根据不同的业务,提供的参数。

业务参数根据业务来定,先说系统参数一般包含:

  • appid:服务商应用唯一标识
  • appsecret: 服务商应用密钥
  • timestamp:时间戳
  • sign:请求签名

系统参数使用url参数传递

业务参数

业务参数是调用开放平台接口时传递的请求参数,如一次订单查询接口,要实现按订单状态的维度查询订单,那么订单查询接口就需要接收status参数,然后去查库后返回订单数据。

业务参数的载体,常用的如:application/jsonapplication/x-www-form-urlencode等。

业务参数使用post请求参数的方式传递,同时也需要参与签名,后面说签名会提到

请求签名

对请求签名的目的就是防止数据被篡改,常见的md5sha都可以用来做为签名算法,理论上只要保证双方能够生成签名和验签就行,像支付宝这类高安全级别的应用就是使用的非对称加密,双方各生成一对私钥和公钥,然后交换公钥用于验签即可。

生成签名的方式自行定义,这里列举一个常见的签名生成方式:

sign = appsecret + appid + timestamp + 业务参数(排序后) + appsecret

伪代码

代码语言:javascript
复制
String appid = "abcd";
String appsecret = "12345";
Long timestamp = 948758686
//有序map,按key的值排序
Map<String, Object> requestBody = new TreeMap<>();
requestBody.put("a", 1);
requestBody.put("b",21);
requestBody.put("c", 2);
//转换成json字符串
String jsonBody = JSON.toJSONString(requestBody);
String sign  = DigestUtils.md5hex(appsecret + appid + timestamp + jsonBody + appsecret);

验签

验签步骤与生成签名的步骤类似,仿代码如下:

代码语言:javascript
复制
String appid = request.getParameter("appid");
String appsecret = request.getParameter("appsecret");
Long timestamp = request.getParameter("timestamp");
//拿出请求的业务参数,转成TreeMap
Map<String, Object> requestBody = new TreeMap<>(JSON.parseObject("post请求参数"));
//转换成json字符串
String jsonBody = JSON.toJSONString(requestBody);
String sign  = DigestUtils.md5hex(appsecret + appid + timestamp + jsonBody + appsecret);
String originSign =  request.getParameter("sign");
if(Objects.equals(sign ,originSign )){
  //验证签名成功
}else{
  //验证签名失败
}

总结

以上就是开放平台接口设计的一些思路,其实也是对接开放平台多了, 对那些开放平台对接的一些基本的套路的一些整理,希望有朝一日能用上。

对接开放平台的时候遇到的问题不少,有的平台有SDK有的是直接是restapi,有SDK的平台对接起来还是挺幸福的,下期给大家整个平台SDK的设计。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OAuth2授权机制
  • 请求参数
    • 业务参数
    • 请求签名
    • 验签
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档