当 session 在 OpenID Connect 设置中过期时,WWW-Authenticate 应该包含什么?

What should WWW-Authenticate contain when a session has expired in an OpenID Connect setup?

场景:

app.com 已将身份验证委托给 openid-connect.provider.com,这意味着未经身份验证的用户如果没有有效的 session,将被重定向到外部提供商进行登录。一旦发生这种情况,他们就会在 app.com 上获得 session 一段时间的 cookie。

虽然 user-flow 没问题,但我想知道如何处理 API 请求?规范说,如果你 return HTTP 401 UNAUTHORIZED 它需要伴随 WWW-Authenticate header 向客户端提供身份验证方案。

那么 app.com return 如果出现 401 应该怎么办?

我看到了 bits and pieces indicating OAuth,但我想这与登录的外部提供商有关,而不是应用程序本身 (app.com)?

示例:

 HTTP/1.1 401 Unauthorized
 WWW-Authenticate: Bearer realm="example",
                   error="invalid_token",
                   error_description="The access token expired"

以上内容似乎不正确,因为 app.com 服务器在 oauth 意义上不使用任何访问令牌,只是本地 session 的普通 session cookie。

当 session cookie 过期时重定向到 OIDC 登录是 UI 前端应用程序广泛使用的一种做法。关于此处使用的 cookie,我认为它与 OIDC 流获取的访问令牌相关(例如:- cookie 生命周期匹配访问令牌生命周期)。

关于 API 访问,我相信提到的 API 使用通过 RFC6750. This RFC define how to use token in subsequent protected API calls. One important part of it is The WWW-Authenticate Response Header Field 部分定义的不记名令牌用法,它定义了要做什么当令牌无效或过期时。您找到的答案和您在问题中提到的示例与 RFC 建议的解释相关。

我认为问题归结为您如何根据 API 进行身份验证。如果您的 API 遵循不记名令牌的用法,请遵循您的示例。将 HTTP 状态代码与 WWW-Authenticate 一起使用。这将带来 spec-compliance.

但是如果有自定义身份验证机制(例如:- cookie),那么它就超出了规范的范围。但是你可以从 API 得到一个 JSON 的响应,其中包含错误详细信息(例如:- Http 代码、原因、描述和用于调试的相关 ID)。我会说 WWW-Authenticate header 在这种情况下是可选的。