OpenID Connect 隐式流:使用重定向响应?
OpenID Connect implicit flow: Respond using a redirect?
假设 OpenID Connect 隐式流主要由单页应用程序 (SPA) 使用,可能第一次访问 backend/API 是通过使用 AJAX 调用完成的,不是通过加载SPA本身。
现在,如果 API 检测到请求是在没有令牌的情况下发送的,它应该如何响应?
恕我直言,用重定向响应没有太大意义,因为这只会导致 AJAX 请求被重定向,而不是整个浏览器 window(这是必要的)。
那么,用 401
回应可以吗?还是有另一种(更好的)方法来做什么?假设 401
没问题,服务器是否应该以某种方式指示要使用哪个身份提供者,或者这完全取决于客户端,并且后端假定客户端知道它信任哪个身份提供者?
RFC6749 没有说明应如何设计响应。
但是,由于客户端需要 API 响应,您的资源服务器应该发送带有适当 HTTP 代码和响应正文的 API 响应。
如果资源服务器因为令牌过期或无效而拒绝请求,则响应代码应为400。
如果访问令牌未在请求范围内颁发,或者资源所有者无权使用该资源,则代码应为 403。
如果未找到令牌,则代码应为 401。
正文可能类似于规范中描述的错误响应:
HTTP/1.1 403 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"error":"insufficient_scope",
"error_description":"The scope 'WRITE' is required.",
"error_uri":"https%3A%2F%2Fwww.example.com%2Fdoc%2Ferror403%2Finsufficient_scope"
}
关于指示使用哪个 IdP 的方式,我知道 specification is being written,但目前由您来指示客户端应如何与您的资源服务器交互(例如文档)。
假设 OpenID Connect 隐式流主要由单页应用程序 (SPA) 使用,可能第一次访问 backend/API 是通过使用 AJAX 调用完成的,不是通过加载SPA本身。
现在,如果 API 检测到请求是在没有令牌的情况下发送的,它应该如何响应?
恕我直言,用重定向响应没有太大意义,因为这只会导致 AJAX 请求被重定向,而不是整个浏览器 window(这是必要的)。
那么,用 401
回应可以吗?还是有另一种(更好的)方法来做什么?假设 401
没问题,服务器是否应该以某种方式指示要使用哪个身份提供者,或者这完全取决于客户端,并且后端假定客户端知道它信任哪个身份提供者?
RFC6749 没有说明应如何设计响应。
但是,由于客户端需要 API 响应,您的资源服务器应该发送带有适当 HTTP 代码和响应正文的 API 响应。
如果资源服务器因为令牌过期或无效而拒绝请求,则响应代码应为400。 如果访问令牌未在请求范围内颁发,或者资源所有者无权使用该资源,则代码应为 403。 如果未找到令牌,则代码应为 401。
正文可能类似于规范中描述的错误响应:
HTTP/1.1 403 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"error":"insufficient_scope",
"error_description":"The scope 'WRITE' is required.",
"error_uri":"https%3A%2F%2Fwww.example.com%2Fdoc%2Ferror403%2Finsufficient_scope"
}
关于指示使用哪个 IdP 的方式,我知道 specification is being written,但目前由您来指示客户端应如何与您的资源服务器交互(例如文档)。