ileeoyo
V2EX  ›  Java

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

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


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

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

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

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