现在要开放一部分数据给合作伙伴公司使用? 打算提供 rest 接口给他们访问,该如何设计授权呢?
1
zoharSoul 2020-05-18 10:42:12 +08:00
懒得想就走标准的 oauth2 呗
|
2
tabris17 2020-05-18 10:44:10 +08:00
最简单的方式就是 nonce+签名
|
3
ISSSSSSS 2020-05-18 10:45:36 +08:00
ZFB 的接入流程就比较标准。可以参考下。主要是公私钥的生成,数据加验签。
|
4
linauror 2020-05-18 10:47:08 +08:00
如果不是做成标准化,那就直接约定一个密钥和签名方式就可以了
|
9
murmur 2020-05-18 10:51:13 +08:00
就 key 签名就可以,要求加入一个随机数
|
10
rioshikelong121 2020-05-18 10:51:44 +08:00
mark 有类似需求.
问下 oauth2 的 Client Credentials 的 grant type 可以做么? |
11
HansLee 2020-05-18 10:51:46 +08:00
如果是一个 server2server 的接口更推荐 OpenId
|
12
ileeoyo OP @rioshikelong121 @zoharSoul
刚看了阮一峰大佬的文文章,感觉 client credentials 还挺符合我的业务场景。我当前业务没有前端,授权针对的是某个公司平台后台,而不是针对某个用户。 其他 3 中 oauth2 授权有:客户端和资源所有者的概念,需要资源所有者授权给某个第三方客户端。而我的场景没有资源所有者的概念,是第三方客户端直接获取授权得到数据 |
14
dilu 2020-05-18 11:17:36 +08:00
如果不打算做成标准化,IP 白名单+简单的 token 验签即可
标准化可以参考 oauth |
15
tabris17 2020-05-18 11:17:46 +08:00
@ileeoyo nonce 是参与签名计算的一次性的随机数。实际操作中,可以用 timestamp 来代替,不过调用者和被调用者之间需要校时,两者时间误差不能太大
|
18
chairuosen 2020-05-18 11:25:25 +08:00
不要用 ip 白名单,第三方一加机器就得找你开白名单
|
19
Guozi1989 2020-05-18 11:28:32 +08:00
简单点就 token+签名的方式吧
|
20
luozic 2020-05-18 11:53:46 +08:00
不要直接调,最好走一个网关或者代理,做一些限流 /监控 /白 or 黑名单控制。
|
21
teawithlife 2020-05-18 11:56:18 +08:00
@tabris17 #15 nonce 不能使用 timestamp,而应该和 timestamp 同时使用,两者结合可以用来防止重放攻击
单独使用 timestamp 的话,因为需要预留一定的容错时间,所以还是存在被重放攻击的风险,加上一个 nonce 就可以避免了 不过对于楼主这种简单需求,白名单应该是最稳妥简便的方式 |
22
tabris17 2020-05-18 12:21:17 +08:00
@teawithlife 实际操作中可以使用 timestamp,一般允许调用者和被调用者之间时差不超过 X 分钟,那么重放攻击的窗口期也就 X 分钟而已。安全性要求不高的场景下没有问题
|
23
dilu 2020-05-18 12:53:26 +08:00
@chairuosen 后台做个添加白名单的功能不就好了?
|
24
hantsy 2020-05-18 13:04:42 +08:00
网络上大部分 Spring Oauth2 server 教程中 ClientID,Client Securets 是写死的。把这个开放出来,给 Client ( App )注册就行了。Client 的意思是 Application Client,就是要访问你的 API 的程序。剩下的就是定义好 Scopes,和允许的 Flow 了。
|
25
hantsy 2020-05-18 13:09:18 +08:00
@ileeoyo 你的所有暴露的 API 都是 resource owner 的,资源拥有者就是你自己(公司),通过 Scopes 来决定授权。
|
26
forgottencoast 2020-05-18 13:13:57 +08:00
这个很简单。
我每次都打开几大网站的 api 后台接口,看别人是怎么设计的。 Google 、Microsoft 、Facebook,这三个参考一下就能弄出来了。 他们设计的也很简单,反正前几年都是 oauth 。 |
28
tinycold 2020-05-18 13:18:51 +08:00 via Android
这玩意儿远远不是一个 OAuth2.0 能说清楚的,里边儿包含了很多行业标准,有个产品叫 Anth0,就是专门做这个,你可以搜一搜看看。
|
29
xuanbg 2020-05-18 13:35:56 +08:00
楼主的需求不是 OAuth2 的菜,应该加密+签名。
|
30
hantsy 2020-05-18 13:40:07 +08:00
@tinycold 现在就 Auth0, okta 两家做得比较大了,应用广泛,各种应用场景集成都是相应的 SDK 支持,开发也简单。
|
31
cbasil 2020-05-18 13:47:58 +08:00
简单一点就用签名咯,再复杂一点就 AES 加密,再复杂一点就 RSA 加密。接口对接用 oauth2 太麻烦了点,又不是对用户授权
|
33
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 来判断是否合法 |
34
seagull7558 2020-05-18 15:30:30 +08:00
推荐个 oauth2 框架,keycloak,应该是可以满足的你需求
|
35
fensou 2020-05-18 16:15:27 +08:00 via iPhone
一定要绑定硬件 key
|
36
deco 2020-05-18 16:28:44 +08:00
可以去看看支付宝支付及微信支付的鉴权接口。
|
37
seagull7558 2020-05-18 17:17:08 +08:00
@hantsy 按照你的设计,使用 client_credentials 模式,传递 client_id 、client_secret 、scope 申请授权
假如说要像阿里云那样,企业下有多个子账号,每一个子账号都有自己的 ak,这种也要使用 client_credentials 吗 |
38
xcstream 2020-05-18 21:13:14 +08:00
参数打包+key 的 md5 就像微信支付一样
|
39
CoderGeek 2020-05-18 21:22:47 +08:00
oauth2
|
40
CoderGeek 2020-05-18 21:23:03 +08:00
|
41
BBCCBB 2020-05-18 21:24:13 +08:00
标准的都是 oauth2.
|
42
rioshikelong121 2020-05-19 11:33:09 +08:00
我的需求和你类似 之前的想法是用 oauth 的客户端认证流来做.
参考了这篇文章以后: https://medium.com/swlh/3-ways-to-secure-your-web-api-for-different-situations-8d5cd4762ab3 我打算使用签名的方式来做. 理由: 给公司其他内部系统使用的,无需标准化. oauth 的成本会略高一些. |
43
daimubai 2022-01-24 16:50:24 +08:00
楼主,你最后是使用了 oauth2 的 client credentials 做的吗,有什么问题吗
|