求教微信公众号开发中两种认证技术的区别?

sheldon
  • 887

本人对微信开发中2个认证方式有些不解,求各位大佬给解释一番。

众所周知,在微信开发者进行开发时,有两个角色和两个场景存在,我分别描述如下:

第一个场景:微信服务器------>我的服务器。

在我要做微信消息的自动回复时,是采用这样的请求链路。即微信服务器把用户消息发到我的服务器,我再返回给微信。

在这个过程中,是这么认证的:是微信服务器这边采用  Sha1(nonceStr+timestap+一个秘钥) 来签个名,然后我收到后重算签名进行校验。  

由于只有我和微信知道这个秘钥(微信叫他token),所以只要签名校验通过,我就可以信任微信服务器。

第二:我的服务器----->调微信服务器的API。

在我要调用微信服务器上的API时,是走这样的链路。例如我要调用微信API来设置我的公众号菜单等等。

这里微信服务器为了检查我的身份,他采用的方式是:让我通过获取accessToken的方式先拿到accessToken,然后再通过accessToken来调用他。

我的问题也就出现在这里:以上两个场景,角色都是一样的,即“我的服务器”和“微信服务器”。唯一的区别就是方向不同。

那么,为什么 [微信到我] 就可以用个简单的签名校验,而 [我到微信] 就要让我"先拿accessToken再维护accessToken还要刷新accessToken"这么麻烦的机制?是出于什么目的要采用不同的认证方式呢?

回复
阅读 1.7k
1 个回答
然后去远足
  • 34.4k

目的不一样,其实前者压根不是你所谓的认证技术。

前者是验签,目的是防止微信给你的数据被中途节点篡改或伪造。因为你的服务器跟微信的服务器不是以一根网线直连的,而且你的服务器也未必支持 HTTPS。而微信给你发消息不需要你的授权,因为你压根也没给微信提供什么服务,是微信单方面发给你。

后者才是鉴权,鉴别你有没有调用这个接口的权限。至于为什么没用验签的方式来确保你给微信的数据不会被篡改,一是微信自己 API 强制 HTTPS 尽可能降低这种可能,二是 AccessToken 有有效期,再就是对于公众号而言数据不是什么敏感信息。你看微信支付这种特别敏感的就是令牌 + 签名双保险、对于退款这类更敏感的操作甚至还加了证书三层保险。

所以要问问题应该是后者为什么没再增加验签的手段。

宣传栏