V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ileeoyo
V2EX  ›  Java

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

  •  
  •   ileeoyo · 2020-05-18 10:39:11 +08:00 · 5787 次点击
    这是一个创建于 1683 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2020-05-18 13:15:48 +08:00
    感谢大家热心给出意见,也给有同样需求的人一些参考。初步决定用 oauth2 的 client credentials 方式。具体的再看看怎么实现。
    43 条回复    2022-01-24 16:50:24 +08:00
    zoharSoul
        1
    zoharSoul  
       2020-05-18 10:42:12 +08:00
    懒得想就走标准的 oauth2 呗
    tabris17
        2
    tabris17  
       2020-05-18 10:44:10 +08:00
    最简单的方式就是 nonce+签名
    ISSSSSSS
        3
    ISSSSSSS  
       2020-05-18 10:45:36 +08:00
    ZFB 的接入流程就比较标准。可以参考下。主要是公私钥的生成,数据加验签。
    linauror
        4
    linauror  
       2020-05-18 10:47:08 +08:00
    如果不是做成标准化,那就直接约定一个密钥和签名方式就可以了
    ileeoyo
        5
    ileeoyo  
    OP
       2020-05-18 10:48:30 +08:00
    @zoharSoul 我看不少使用 oauth2 的,打算看看阮一峰的博客研究一下
    ileeoyo
        6
    ileeoyo  
    OP
       2020-05-18 10:49:14 +08:00
    @linauror 还是打算标准一点,得考虑一下固定密钥泄露的情况
    ileeoyo
        7
    ileeoyo  
    OP
       2020-05-18 10:49:39 +08:00
    @tabris17 nonce 指的是?
    ileeoyo
        8
    ileeoyo  
    OP
       2020-05-18 10:49:58 +08:00
    @ISSSSSSS 感谢意见,可以看一下
    murmur
        9
    murmur  
       2020-05-18 10:51:13 +08:00
    就 key 签名就可以,要求加入一个随机数
    rioshikelong121
        10
    rioshikelong121  
       2020-05-18 10:51:44 +08:00
    mark 有类似需求.
    问下 oauth2 的 Client Credentials 的 grant type 可以做么?
    HansLee
        11
    HansLee  
       2020-05-18 10:51:46 +08:00
    如果是一个 server2server 的接口更推荐 OpenId
    ileeoyo
        12
    ileeoyo  
    OP
       2020-05-18 11:01:46 +08:00
    @rioshikelong121 @zoharSoul
    刚看了阮一峰大佬的文文章,感觉 client credentials 还挺符合我的业务场景。我当前业务没有前端,授权针对的是某个公司平台后台,而不是针对某个用户。
    其他 3 中 oauth2 授权有:客户端和资源所有者的概念,需要资源所有者授权给某个第三方客户端。而我的场景没有资源所有者的概念,是第三方客户端直接获取授权得到数据
    ileeoyo
        13
    ileeoyo  
    OP
       2020-05-18 11:02:57 +08:00
    @HansLee 是 server2server,openid 指的是?
    dilu
        14
    dilu  
       2020-05-18 11:17:36 +08:00
    如果不打算做成标准化,IP 白名单+简单的 token 验签即可


    标准化可以参考 oauth
    tabris17
        15
    tabris17  
       2020-05-18 11:17:46 +08:00
    @ileeoyo nonce 是参与签名计算的一次性的随机数。实际操作中,可以用 timestamp 来代替,不过调用者和被调用者之间需要校时,两者时间误差不能太大
    ileeoyo
        16
    ileeoyo  
    OP
       2020-05-18 11:22:01 +08:00
    @dilu 如果不需要很多时间,还是标准一点
    ileeoyo
        17
    ileeoyo  
    OP
       2020-05-18 11:23:12 +08:00
    @tabris17 能再详细点提示下吗
    chairuosen
        18
    chairuosen  
       2020-05-18 11:25:25 +08:00
    不要用 ip 白名单,第三方一加机器就得找你开白名单
    Guozi1989
        19
    Guozi1989  
       2020-05-18 11:28:32 +08:00
    简单点就 token+签名的方式吧
    luozic
        20
    luozic  
       2020-05-18 11:53:46 +08:00
    不要直接调,最好走一个网关或者代理,做一些限流 /监控 /白 or 黑名单控制。
    teawithlife
        21
    teawithlife  
       2020-05-18 11:56:18 +08:00
    @tabris17 #15 nonce 不能使用 timestamp,而应该和 timestamp 同时使用,两者结合可以用来防止重放攻击
    单独使用 timestamp 的话,因为需要预留一定的容错时间,所以还是存在被重放攻击的风险,加上一个 nonce 就可以避免了

    不过对于楼主这种简单需求,白名单应该是最稳妥简便的方式
    tabris17
        22
    tabris17  
       2020-05-18 12:21:17 +08:00
    @teawithlife 实际操作中可以使用 timestamp,一般允许调用者和被调用者之间时差不超过 X 分钟,那么重放攻击的窗口期也就 X 分钟而已。安全性要求不高的场景下没有问题
    dilu
        23
    dilu  
       2020-05-18 12:53:26 +08:00
    @chairuosen 后台做个添加白名单的功能不就好了?
    hantsy
        24
    hantsy  
       2020-05-18 13:04:42 +08:00
    网络上大部分 Spring Oauth2 server 教程中 ClientID,Client Securets 是写死的。把这个开放出来,给 Client ( App )注册就行了。Client 的意思是 Application Client,就是要访问你的 API 的程序。剩下的就是定义好 Scopes,和允许的 Flow 了。
    hantsy
        25
    hantsy  
       2020-05-18 13:09:18 +08:00
    @ileeoyo 你的所有暴露的 API 都是 resource owner 的,资源拥有者就是你自己(公司),通过 Scopes 来决定授权。
    forgottencoast
        26
    forgottencoast  
       2020-05-18 13:13:57 +08:00
    这个很简单。
    我每次都打开几大网站的 api 后台接口,看别人是怎么设计的。
    Google 、Microsoft 、Facebook,这三个参考一下就能弄出来了。
    他们设计的也很简单,反正前几年都是 oauth 。
    ileeoyo
        27
    ileeoyo  
    OP
       2020-05-18 13:14:21 +08:00
    @hantsy 我再看下 scope 这么限制 具体的访问权限
    tinycold
        28
    tinycold  
       2020-05-18 13:18:51 +08:00 via Android
    这玩意儿远远不是一个 OAuth2.0 能说清楚的,里边儿包含了很多行业标准,有个产品叫 Anth0,就是专门做这个,你可以搜一搜看看。
    xuanbg
        29
    xuanbg  
       2020-05-18 13:35:56 +08:00
    楼主的需求不是 OAuth2 的菜,应该加密+签名。
    hantsy
        30
    hantsy  
       2020-05-18 13:40:07 +08:00
    @tinycold 现在就 Auth0, okta 两家做得比较大了,应用广泛,各种应用场景集成都是相应的 SDK 支持,开发也简单。
    cbasil
        31
    cbasil  
       2020-05-18 13:47:58 +08:00
    简单一点就用签名咯,再复杂一点就 AES 加密,再复杂一点就 RSA 加密。接口对接用 oauth2 太麻烦了点,又不是对用户授权
    GTim
        32
    GTim  
       2020-05-18 13:50:32 +08:00
    @cbasil 还可以用 JWT,`sub` 表示 `client_id` 然后加密密钥用来表示 client_secret
    fgt
        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 来判断是否合法
    seagull7558
        34
    seagull7558  
       2020-05-18 15:30:30 +08:00
    推荐个 oauth2 框架,keycloak,应该是可以满足的你需求
    fensou
        35
    fensou  
       2020-05-18 16:15:27 +08:00 via iPhone
    一定要绑定硬件 key
    deco
        36
    deco  
       2020-05-18 16:28:44 +08:00
    可以去看看支付宝支付及微信支付的鉴权接口。
    seagull7558
        37
    seagull7558  
       2020-05-18 17:17:08 +08:00
    @hantsy 按照你的设计,使用 client_credentials 模式,传递 client_id 、client_secret 、scope 申请授权
    假如说要像阿里云那样,企业下有多个子账号,每一个子账号都有自己的 ak,这种也要使用 client_credentials 吗
    xcstream
        38
    xcstream  
       2020-05-18 21:13:14 +08:00
    参数打包+key 的 md5 就像微信支付一样
    CoderGeek
        39
    CoderGeek  
       2020-05-18 21:22:47 +08:00
    oauth2
    CoderGeek
        40
    CoderGeek  
       2020-05-18 21:23:03 +08:00
    BBCCBB
        41
    BBCCBB  
       2020-05-18 21:24:13 +08:00
    标准的都是 oauth2.
    rioshikelong121
        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 的成本会略高一些.
    daimubai
        43
    daimubai  
       2022-01-24 16:50:24 +08:00
    楼主,你最后是使用了 oauth2 的 client credentials 做的吗,有什么问题吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1074 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:11 · PVG 03:11 · LAX 11:11 · JFK 14:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.