开放 api 接口,如何做签名验证?

2019-10-16 10:39:50 +08:00
 leiuu

RT。

V 友好,想请教一个问题。

场景是这样的,我需要暴露一个 api 给第三方,第三方有可能会把这个 api 放到公开网站中。

如果没有做签名校验的话,可能爬虫 /任何人都能触发这个链接,这会导致系统会有很多非法的请求,进而带来系统数据异常等其他损失。

针对这类问题,大家一般会用什么方法去解决?

7819 次点击
所在节点    程序员
40 条回复
Balthild
2019-10-16 10:46:19 +08:00
hmac 算法,对 URI + Body 签名
yoshiyuki
2019-10-16 10:49:13 +08:00
1,生成密钥 key
2,要求客户端调用的时候,带上自己的密钥 id,并用参数转字符串后拼接密钥,md5 后得到签名
3,服务端校验签名
arrow8899
2019-10-16 10:49:26 +08:00
签名在这里没用吧,对方也可能把签名算法公开出去。
可以用 IP 白名单,限制第三方服务器特定的 IP 才能访问。
laravel
2019-10-16 10:50:38 +08:00
oauth 啊,给他一个 appid appsecret 他可以用这俩获取 access token (有过期时间的),微信公众平台 等不都是这样的吗
CantSee
2019-10-16 11:04:30 +08:00
微信 银联 支付宝的不是有现成的例子啊!
littleylv
2019-10-16 11:06:28 +08:00
一般的解决方案就是 OAuth 2.0
xiaoyangsa
2019-10-16 11:17:00 +08:00
收费,按调用次数。。。
leiuu
2019-10-16 11:19:19 +08:00
@yoshiyuki 👍 这个看起来合理。还有一个小问题,如何防止这个带签名的链接被暴露后重复调用?
leiuu
2019-10-16 11:20:08 +08:00
@Balthild 感谢,我了解一下。
phantomzz
2019-10-16 11:22:08 +08:00
hmac 算法对 query params + timestamp + secret key 进行签名,服务器端用同样算法进行验签。
leiuu
2019-10-16 11:22:35 +08:00
@littleylv
@laravel
@littleylv

都推荐了 OAuth,我了解一下。🙏
leiuu
2019-10-16 11:22:50 +08:00
@xiaoyangsa 不行 😂😂
xiaoyangsa
2019-10-16 11:25:28 +08:00
@leiuu
那就学微信的公众号登录授权吧。这个靠谱点。
leiuu
2019-10-16 11:25:53 +08:00
@CantSee 求详解。

@arrow8899 ip 白名单的话可能不太好弄,假设这个 api 要面对几百几千个第三方。用签名的方法的话, 如果被公开的话确实没什么好的办法。只能走商务路径了哈哈哈哈。
shadow88sky
2019-10-16 11:29:18 +08:00
就是 Oauth 认证 不用想
unco020511
2019-10-16 11:31:16 +08:00
请参考微信支付宝,蛮简单
waterlaw
2019-10-16 11:32:14 +08:00
之前公司用第三方的接口,Oauth + 签名
anyforever
2019-10-16 11:33:37 +08:00
如果对方想公开密钥,你用什么签都没用啊,相当于人家把钥匙丢了,而你这锁又没换,捡到钥匙的当然可以随时开你的锁了。所以避免别人丢钥匙,你就得给他加个 IP 验证
fancy111
2019-10-16 11:34:25 +08:00
既然都放到公开网站上了,加密签名授权什么的都是没用的。既然网页能调用,我利用链接一样可以。
唯一就是加白名单了,具体情况你没说清楚。
eason1874
2019-10-16 11:41:29 +08:00
最好的校验方法是加几个参数,timestamp、appid 和 sign(除 sign 以外所有参数按字母升序排序,密钥)。

再加上 IP 白名单是最安全的,不过这个不是什么场景都有条件。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/609802

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX