Flask微信公众号开发之模板消息(三)


服务-请求循环中的身份验证

服务器验证:

使用微信公众号连接粉丝,首先要有提供服务的服务器(我的服务器在阿里云,以下简称Ali),微信充当Ali和粉丝之间的代理人。即,微信转发粉丝的主动请求给Ali、转发Ali的响应给粉丝;Ali把主动发送给粉丝的内容发送到微信接口、微信将内容转发到粉丝。

设置Ali的地址时,同时要设置一个Token,该Token用于验证一个数字签名(也称之摘要或密文);微信和Ali需要使用公开的、约定的方法,结合Token算出一个数字签名,二者算的签名如果一致,则地址设置成功。具体是微信向Ali发送一个时间戳T、一个随机字符串N、一个数字签名S、另一个随机字符串E。使用sha1算法,用Token和T、N算出S,计算成功则把E回复给微信。

事实上,不仅在设置地址时,微信会发来T、N、S、E,以后微信发来的任何请求,都带有T、N、S、E,区别是后者的E是空值。Ali为了更加安全,可以每次都进行验证,也可以不验证。

我用Python Flask开发服务,所以很简单,使用装饰器@app.before_request装饰的方法在任意请求正式处理之前会被调用(预处理)。该方法如果返回一个值,那么请求会被提前终止、截获:

@app.before_request
def auth():
    resp = access.auth()
    if resp:
        return resp

access模块的auth方法在①处理服务器设置验证时,如果成功则返回E,失败则返回"未识别的请求";②处理其他请求时,成功则返回空字符,失败则返回"未识别的请求"。

在我设计的框架中,业务数据放在公司局域网,外网不能访问,——借助局域网穿透工具可以访问,没有使用。这样做目的是保证公司数据的安全。所以Ali不只要处理来自微信的请求,也要处理来自公司网络的请求,而我也为公司网络的请求设计了使用token的验证方法,一并写在access.auth()方法中。

接口验证:

服务器验证主要用于Ali检查收到的请求是否真的来自微信,接口验证则用于微信检查收到的请求是否真的来自我的企业微信ID。

当启用微信公众号后台服务时,微信会为我的企业微信ID生成一个APP SECRET,以后Ali在调用任何微信接口前,必须用ID和APP SECRET获取ACCESS TOKEN,然后继续使用ACCESS TOKEN调用接口。