我已经在服务器上初始请求验证发生之前实现了OAuth2 auth端点,然后向用户显示任何登录表单并且一切都有意义。像这样:
+---------------------+
| Client (third party)|
+---------------------+
|
V
+------------+ +---------------+
| | ----- GET /oauth2/authorization ---->| |
| User-Agent | <--- sign in form (IF VALID REQ) ----| Authorization |
| (browser) | | Server |
| | | |
| | ---------- credentials ------------->| |
| | <----- short lived token/cookie ----| |
| | | |
| | | |
| | ----- POST /oauth2/authorize ------->| |
| | <------- grant token (code) ---------| |
| | +---------------+
| |
| | --- redirect_uri?code=ABC
+------------+ |
V
(captured by client)
上面有2个地方我可以遇到500/503,初始GET请求或以下2个电话中的任何一个。如果是前者,则将500/503直接发送给可以按照自己的意愿处理的客户。如果是后者,我此时已经验证了提供的redirect_uri
,并且能够通过用户代理重定向安全地发送错误。
这次授权端点实际上是一个从哑资产服务器提供的React应用程序,所有数据(包括执行请求验证所需的数据都存在于单独的API服务器上)。像这样:
+---------------------+
| Client (third party)|
+---------------------+
|
V
+------------+ +---------------+
| | ----- GET /oauth2/authorization ---->| Dumb |
| User-Agent | <---------- skeleton html -----------| Asset |
| (browser) | | Server |
| | +---------------+
| |
| | +---------------+
| | ------- POST /oauth2/validate ------>| |
| | <------- status (OK/500/503) --------| |
| if OK, | | |
| render | | |
| form | ---------- credentials ------------->| |
| | <----- short lived token/cookie ----| API |
| | | Server |
| | | |
| | ----- POST /oauth2/authorize ------->| |
| | <------- grant token (code) ---------| |
| | +---------------+
| |
| | --- redirect_uri?code=ABC
+------------+ |
V
(captured by client)
在此流程中,浏览器立即启动API调用以验证oauth请求。在幸福的道路上,这很好。请求已经过验证,我会渲染我的表单,并且所有内容都遵循与前一个案例相同的例程。
但是,当POST /oauth2/validate
返回500或503时我该怎么办?此时,我尚未验证提供的redirect_uri
,因此根据OAuth2 spec,我不应通过用户代理重定向发送server_error
/ temporarily_unavailable
错误。
但是,我是否只是在错误消息中向资源所有者提供错误,就像合法uri_mismatch
一样?这感觉很糟糕,因为它比上面的传统版本更具功能性。
其他人在类似于此的客户端/ api架构中实现授权端点吗?你是怎么做到的?