ileeoyo
V2EX  ›  Java

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

  •  
  •   ileeoyo · May 18, 2020 · 6512 views
    This topic created in 2186 days ago, the information mentioned may be changed or developed.

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

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


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

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

    参考了这篇文章以后: https://medium.com/swlh/3-ways-to-secure-your-web-api-for-different-situations-8d5cd4762ab3

    我打算使用签名的方式来做. 理由: 给公司其他内部系统使用的,无需标准化. oauth 的成本会略高一些.
    daimubai
        43
    daimubai  
       Jan 24, 2022
    楼主,你最后是使用了 oauth2 的 client credentials 做的吗,有什么问题吗
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1308 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 87ms · UTC 23:52 · PVG 07:52 · LAX 16:52 · JFK 19:52
    ♥ Do have faith in what you're doing.