授权接口给其他公司该如何设计?

2020-05-18 10:39:11 +08:00
 ileeoyo

现在要开放一部分数据给合作伙伴公司使用? 打算提供 rest 接口给他们访问,该如何设计授权呢?

5752 次点击
所在节点    Java
43 条回复
teawithlife
2020-05-18 11:56:18 +08:00
@tabris17 #15 nonce 不能使用 timestamp,而应该和 timestamp 同时使用,两者结合可以用来防止重放攻击
单独使用 timestamp 的话,因为需要预留一定的容错时间,所以还是存在被重放攻击的风险,加上一个 nonce 就可以避免了

不过对于楼主这种简单需求,白名单应该是最稳妥简便的方式
tabris17
2020-05-18 12:21:17 +08:00
@teawithlife 实际操作中可以使用 timestamp,一般允许调用者和被调用者之间时差不超过 X 分钟,那么重放攻击的窗口期也就 X 分钟而已。安全性要求不高的场景下没有问题
dilu
2020-05-18 12:53:26 +08:00
@chairuosen 后台做个添加白名单的功能不就好了?
hantsy
2020-05-18 13:04:42 +08:00
网络上大部分 Spring Oauth2 server 教程中 ClientID,Client Securets 是写死的。把这个开放出来,给 Client ( App )注册就行了。Client 的意思是 Application Client,就是要访问你的 API 的程序。剩下的就是定义好 Scopes,和允许的 Flow 了。
hantsy
2020-05-18 13:09:18 +08:00
@ileeoyo 你的所有暴露的 API 都是 resource owner 的,资源拥有者就是你自己(公司),通过 Scopes 来决定授权。
forgottencoast
2020-05-18 13:13:57 +08:00
这个很简单。
我每次都打开几大网站的 api 后台接口,看别人是怎么设计的。
Google 、Microsoft 、Facebook,这三个参考一下就能弄出来了。
他们设计的也很简单,反正前几年都是 oauth 。
ileeoyo
2020-05-18 13:14:21 +08:00
@hantsy 我再看下 scope 这么限制 具体的访问权限
tinycold
2020-05-18 13:18:51 +08:00
这玩意儿远远不是一个 OAuth2.0 能说清楚的,里边儿包含了很多行业标准,有个产品叫 Anth0,就是专门做这个,你可以搜一搜看看。
xuanbg
2020-05-18 13:35:56 +08:00
楼主的需求不是 OAuth2 的菜,应该加密+签名。
hantsy
2020-05-18 13:40:07 +08:00
@tinycold 现在就 Auth0, okta 两家做得比较大了,应用广泛,各种应用场景集成都是相应的 SDK 支持,开发也简单。
cbasil
2020-05-18 13:47:58 +08:00
简单一点就用签名咯,再复杂一点就 AES 加密,再复杂一点就 RSA 加密。接口对接用 oauth2 太麻烦了点,又不是对用户授权
GTim
2020-05-18 13:50:32 +08:00
@cbasil 还可以用 JWT,`sub` 表示 `client_id` 然后加密密钥用来表示 client_secret
fgt
2020-05-18 14:30:05 +08:00
我这边的一个类似设计是:对方先调用我方 queryNonce 接口获取随机码 nonce (参数是对方的系统唯一 id ),然后它在本地计算 token=Md5(timestamp+nonce),然后将 timestamp 和 token 放在 header 中进行调用;
我方收到请求后先判断 timestamp 是否误差查过 5 分钟,然后拿本地存储的 nonce 进行同样的 Md5(timestamp+nonce)计算得到 localToken,然后根据 localToken 是否等于 token 来判断是否合法
seagull7558
2020-05-18 15:30:30 +08:00
推荐个 oauth2 框架,keycloak,应该是可以满足的你需求
fensou
2020-05-18 16:15:27 +08:00
一定要绑定硬件 key
deco
2020-05-18 16:28:44 +08:00
可以去看看支付宝支付及微信支付的鉴权接口。
seagull7558
2020-05-18 17:17:08 +08:00
@hantsy 按照你的设计,使用 client_credentials 模式,传递 client_id 、client_secret 、scope 申请授权
假如说要像阿里云那样,企业下有多个子账号,每一个子账号都有自己的 ak,这种也要使用 client_credentials 吗
xcstream
2020-05-18 21:13:14 +08:00
参数打包+key 的 md5 就像微信支付一样
CoderGeek
2020-05-18 21:22:47 +08:00
oauth2
CoderGeek
2020-05-18 21:23:03 +08:00

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

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

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

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

© 2021 V2EX