Oauth 2.0 保护HTTP API的安全
我需要保护一个面向公众的HTTP API,在这里我不能接触API服务器上的代码 HTTP API有多个最终用户,他们将使用非交互式客户端(通常是后端服务)使用它。需要明确的是,客户机拥有其将访问的资源,因此必须提供给用户,因为授权逻辑需要绑定到最终用户 我在玩弄使用和 然后使用提供的访问令牌获取一个客户端可以呈现给HTTP代理的消息,该代理在将请求传递给HTTP API服务器之前解析该请求 以下是我设想的流程:Oauth 2.0 保护HTTP API的安全,oauth-2.0,jwt,Oauth 2.0,Jwt,我需要保护一个面向公众的HTTP API,在这里我不能接触API服务器上的代码 HTTP API有多个最终用户,他们将使用非交互式客户端(通常是后端服务)使用它。需要明确的是,客户机拥有其将访问的资源,因此必须提供给用户,因为授权逻辑需要绑定到最终用户 我在玩弄使用和 然后使用提供的访问令牌获取一个客户端可以呈现给HTTP代理的消息,该代理在将请求传递给HTTP API服务器之前解析该请求 以下是我设想的流程: +----------+
+----------+ +---------------+
| |>--(A)---- Resource Owner ------->| |
| | Password Credentials | Authorization |
| Client | | Server |
| |<--(B)---- Access Token ---------<| |
| | (w/Refresh Token) |---------------|
| | | |
| |>—-(C)---- Request JWT ——-------->| JWT Service |
| | (w/Access Token) | |
| | | |
| |<--(D)---- JWT ------------------<| |
| | | |
+----------+ +---------------+
v
|
|
| +---------------+
| | |
| | HTTP |
--(E)---- HTTP Request w/JWT ---------->| Proxy |
| |
| (F) |
| |
+---------------+
v
|
(G)
|
v
+---------------+
| |
| HTTP |
| API |
| |
+---------------+
(A), (B), (C) Get an access token using the Password Grant flow.
(D) Use access token to get a JWT.
(E) Attach JWT to HTTP request and send it to the HTTP Proxy.
(F) Check that JWT is valid.
(G) Pass request to the HTTP API Server.
+------------++---------------+
||>--(A)--资源所有者------->|
||密码凭证|授权|
|客户端| |服务器|
|| | JWT服务|
||(带接入令牌)||
| | | |
|我对这个答案投了反对票,所以我最好解释一下
我不是建议“只编写自己的安全libs”的人,但我确实对oauth+api客户机(尤其是oauth2)例外
为什么不是Oauth2?
与传统身份验证方案相比,额外的跃点和额外的系统组件
无论您做什么,使用其他编程语言的人可能没有与您使用的任何语言兼容的客户端库,
- 想一想:没有人会赚钱让ie基本身份验证“简单,兼容1000多个提供者,并且只工作”(引用oauth.io),这是因为基本身份验证只在每个“提供者”上工作,而oauth2是一个有点糟糕、复杂、不可互操作的框架-这就是为什么我们称基本身份验证为“协议”,我们称oauth(1)为协议,但称oauth2为框架
想想维护非交互式客户机的含义:
您在整个集群中拥有一个承载令牌
因此,您需要一个分布式键值存储或DB表来保存它
您将需要捕获特定的错误,这意味着承载者
过期
在这种情况下,您将希望无缝地请求
然后重试请求(不丢失请求)
这里的问题是,在一个繁忙的站点上,这种情况可能会在年开始发生
在100个螺纹上平行
因此,您需要一个分布式锁定机制来正确地执行此操作-当需要时,redis mutex是我选择的毒药
有人用oauth api向我打招呼
那+祝你好运测试那块复合体
分布式竞争条件逻辑,当你打破你的背部做
它(hi webmock)之后,您仍然会不时地遇到随机的非确定性故障,因为并发之神遇到了VCR/webmock无法很好地处理的一些条件组合
这是一个秘密,或者只是一个nonce和HTTP主体
(我的重点)
邮件列表上、会议上、会议中所有艰难的妥协
专门的设计委员会和后台渠道导致了
未能实现其两个主要目标的规范 — 安全和
互操作性。事实上,其中一个折衷办法是将其重命名
从一个协议到一个框架,再加上一个免责声明
警告该规范不同于生成可互操作的
实施。
与OAuth 1.0相比,2.0规范更为复杂,
互操作性差、实用性差、不完整,而且
重要的是,不太安全
很清楚,OAuth 2.0由一位具有深度开发能力的开发人员掌握
对网络安全的理解可能会导致一个安全的结果
然而,在大多数开发人员手中 — 一如既往
过去两年的经验 — 2.0很可能会产生
实施不安全。
在现实世界中,Facebook仍然在运行一年12号草稿
半个月前,完全没有理由更新他们的
毕竟,更新后的2.0客户端是为与
Facebook的实现不太可能对任何其他应用程序有用
OAuth2.0提供的代码很少甚至没有
可重用性
2.0提供的是授权协议的蓝图
从定义上讲,它基本上是无用的,并且必须被配置成一个工作模式
解决方案 — 这就是企业方式。WS-*方式.2.0提供了
销售咨询服务和集成的全新前沿
解决方案
该怎么办?
Oauth通常是过度杀伤力,除非你正在创建一个更大的生态系统
更简单的解决方案是DIY,定义为:
即
其中:
authentication\u id
是一个固定字符串,用于描述正在使用的身份验证类型
api\u client\u id
是标识api客户机的公共信息(我假设api有多个客户机,或者在某一点上它将有多个客户机)-api客户机id允许您将api客户机与api客户机的secret
nonce
只是一个随机字符串
secret
是一个只有您和客户端知道的随机字符串,客户端应将其视为密码(即不将其提交到版本控制)
digest
是api\u client\u id
+nonce
+secret
的SHA512十六进制/base64摘要(您也可以添加并连接HTTP正文,除非正文很大,比如文件上载时)
如果客户机通过了身份验证,只需将请求转发到后端API服务并将其响应返回给客户机,否则会出现错误
authentication_id api_client_id nonce digest
FooApp-SHA512-fixed 4iuz43i43uz chc42n8chn823 fshi4z73h438f4h34h348h3f4834h7384