【发布时间】:2018-03-16 20:11:54
【问题描述】:
我需要保护一个面向公众的 HTTP API我无法在 API 服务器上接触代码。
HTTP API 有多个最终用户,他们将使用非交互式客户端(通常是后端服务)来使用它。需要明确的是,客户端拥有它将访问的资源,因此必须提供给用户,因为授权逻辑需要与最终用户绑定。
我正在考虑使用OAuth2 和Resource Owner Password Credentials Grant 然后使用提供的访问令牌获取JWT,客户端可以将其呈现给 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.
有没有其他人解决过类似的用例并愿意提供一些启示或进行讨论?
【问题讨论】:
-
您是否接受了使用 Oauth 的想法?如果您要进行大型分布式设置,Oauth 非常棒,但是对于“安全的 this 1 api”,任何类型的基于标头的身份验证都可以实现,并且实现起来超级简单
-
我目前还没有承诺任何事情,但我确实喜欢可以撤销的短期访问令牌的想法,而且我似乎使用 Oauth2 开箱即用。
-
JWT 服务应该做什么?为什么要将自定义 JWT 发送到 API 而不是访问令牌?
-
>oauth 2 “开箱即用”没有什么“开箱即用”,因为符合规范的 OAuth 2 服务器将支持特定声明的访问和刷新令牌。我宁愿不要自己推出这种功能并被超级黑客攻击。 :)
-
@JánHalaša JWT 将用于传递与授权相关的信息,HTTP 前端将解析这些信息以确定用户是否具有访问权限。我想我可以使用 Oauth 2 Scopes 和原始 Oauth 2 访问令牌来完成相同的操作。