资讯专栏INFORMATION COLUMN

access key 笔记

lavnFan / 3059人阅读

摘要:题外话微信公众号开发接口里面,是通过调用微信的接口的。生成方式如下接口调用请求说明请求方式通过传给微信后台,后台就会返回,这个是有有效期的,有点类似浏览器登录。正常情况下,微信会返回下述数据不过个人觉得传的方式不太优雅。

用户认证

后台服务要提供公共接口给用户调用,必须要提供认证机制,一旦用户认证通过,才让用户调用API。对于次,可以通过(access_key,secret_access_key)来认证。
这个(access_key,secret_access_key)是成对存在的。用户要调用API必须要申请这样的一对数据。一般工作流程是:

用户在前端申请access key

服务器在后台生成(access_key,secret_access_key),然后存进数据库,然后把这对数据返回给用户

用户的调用API流程是:

通过secret_access_key来给请求参数签名,并且把签名附加到请求里,然后发请求给服务器

服务器通过请求里的参数access_key来查询数据库里的secret_access_key,然后用secret_access_key计算请求参数的签名是否跟请求里的签名一致,一致则确认用户身份,不一致则拒绝访问。

签名

接下来介绍给参数签名的方法。如果请求参数如下:

{
    "name": "fami",
    "address": "pek"
}

把access_key加进这个请求里:

{
    "name": "fami",
    "address": "pek",
    "access_key": "abc"
}

将这些参数按key的字母升序排序,然后以key=value的形式表示,然后用&连接起来。效果如下:

access_key=abc&address=pek&name=fami

然后用以secret_access_key为key用sha256(或其他算法)对这个字符串进行签名,如果签名后得到`

signature = "xxxxxxxx"

那么把这个签名添加到请求参数里,得到

{
    "access_key": "abc",
    "name": "fami",
    "address": "pek",
    "signature": "xxxxxxxx"
}

最终把这个发给服务器,服务器根据参数里的access_key去查看secret_access_key,然后把参数里的signature字段取出来,用前面的签名方法来对剩下的参数进行签名,如果发现自己计算的签名跟请求参数里的签名一样,那么则通过认证。

安全问题

这里会有一个问题:如果这个(access_key,secret_access_key)被别人知道了,那么别人就会以我的身份去调用API了。确实会有这个问题,针对此,可以用以下的方法来减小影响。

access key支持ip白名单,只有在白名单内的ip才可以调用API。

access key支持设置有效期,也就是在有效时间内,该access key有效,过了这个有效期,就拒绝访问。

access key支持修改状态,只有状态为可用的情况下,服务器才会接受。

用户使用API必然会担心安全问题。在此之外还可以做些类似定期提醒用户修改access key状态,或者定期删除access key。

题外话

微信公众号开发接口里面,是通过access_token调用微信的接口的。access_token生成方式如下:

接口调用请求说明

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

通过传appid, appsecret给微信api后台,后台就会返回access_token,这个access_token是有有效期的,有点类似浏览器登录。
正常情况下,微信会返回下述JSON数据:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

不过个人觉得传appsecret的方式不太优雅。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41906.html

相关文章

  • 关于ThinkPHP5中使用 Auth2 验证的实现

    在tp上实现的auth2验证的,在网上发现笔记很少, 不像yii, 故在此发表一下笔记,用来帮助有相关需求的朋友 PS: 鉴于oauth2有四种方案, 本实例是基于 客户端凭证 实现,其他三种就不讲述了 一、通过composer安装 composer require --prefer-dist bshaffer/oauth2-server-php 安装完成后,如图:showImg(https://...

    alaege 评论0 收藏0
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1

    摘要:检查是否存在创建序列化负载传输给客户端命令的核心内容是创建序列化负载,该功能的实现是调用函数。可以看出,四个命令的实现原理都是调用函数。 顺风车运营研发团队 谭淼1、dumpdump命令可以序列化给定 key ,并返回被序列化的值,使用 RESTORE命令可以将这个值反序列化为 Redis 键。 /* DUMP keyname * DUMP is actually not used ...

    KevinYan 评论0 收藏0
  • js 闭包理解笔记

    摘要:发现指向的是,也就是说,在函数内部实现的闭包函数已经被转变成了全局函数,存储到了内存中。闭包同样可以模拟面向对象的私有变量的方法和变量的使用和获取。 https://developer.mozilla.org... 首先引用来自官网文档的定义: closure is the combination of a function and the lexical environment wi...

    liuyix 评论0 收藏0
  • Nginx基础笔记

    摘要:压力测试工具请求数并发数请求是一个高性能的和反向代理服务,也是一个服务。 压力测试工具:ab ab -n 请求数 -c 并发数 请求url Nginx: Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。 特点: IO多路复用epoll 轻量级 CPU亲和(affinity):把每个worker进程固定在一个cpu上执...

    caige 评论0 收藏0

发表评论

0条评论

lavnFan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<