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

2019 年 10 月 16 日
 leiuu

RT。

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

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

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

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

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

都推荐了 OAuth,我了解一下。🙏
leiuu
2019 年 10 月 16 日
@xiaoyangsa 不行 😂😂
xiaoyangsa
2019 年 10 月 16 日
@leiuu
那就学微信的公众号登录授权吧。这个靠谱点。
leiuu
2019 年 10 月 16 日
@CantSee 求详解。

@arrow8899 ip 白名单的话可能不太好弄,假设这个 api 要面对几百几千个第三方。用签名的方法的话, 如果被公开的话确实没什么好的办法。只能走商务路径了哈哈哈哈。
shadow88sky
2019 年 10 月 16 日
就是 Oauth 认证 不用想
unco020511
2019 年 10 月 16 日
请参考微信支付宝,蛮简单
waterlaw
2019 年 10 月 16 日
之前公司用第三方的接口,Oauth + 签名
anyforever
2019 年 10 月 16 日
如果对方想公开密钥,你用什么签都没用啊,相当于人家把钥匙丢了,而你这锁又没换,捡到钥匙的当然可以随时开你的锁了。所以避免别人丢钥匙,你就得给他加个 IP 验证
fancy111
2019 年 10 月 16 日
既然都放到公开网站上了,加密签名授权什么的都是没用的。既然网页能调用,我利用链接一样可以。
唯一就是加白名单了,具体情况你没说清楚。
eason1874
2019 年 10 月 16 日
最好的校验方法是加几个参数,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