桌面应用程序的 OpenID Connect 受保护 API

OpenID Connect protected API for a desktop application

我正在构建一个 WPF .NET windows 应用程序,它将连接到 API。因为我们还有其他 API,我想开始将所有登录逻辑放入一个 module/service 中,以标准化方式处理它。我认为 OpenID Connect (OIDC) 是一个很好的协议。

据我所知,使用 PKCE 的授权代码流是实现此目的的方法。如果我以正确的方式进行此操作,我希望有人为我确认。下面是我想我需要实现的流程:

  1. 用户启动应用程序并通过嵌入式浏览器登录到我们的 OIDC 提供程序(通过代码和 PKCE 流程)。客户端是我们的原生应用,范围限制在'profile' 'the-api'.
  2. 用户登录后,使用应用程序可以拦截的 POST 重定向返回刷新令牌和访问令牌。
  3. 本机应用程序使用该访问令牌获取用户信息并在应用程序中显示个人资料信息。
  4. 本机应用程序使用 access_token 向 API 发送请求。
  5. api 通过在 OP 的用户信息端点检查 access_token 并确保它具有正确的范围来验证用户。

我认为本机客户端在将每个请求发送到 API 之前应该检查 access_token。如果 access_token 已过期或即将过期(可能不到 30 秒),则在发送请求之前获取新的 access_token。

让我对此感到不确定的是没有重定向到 API。许多流将用户重定向到 OP,然后重定向回 API。我想这没有那个的原因是因为它是本机的并且不像浏览器那样直接支持重定向到页面。

我的做法正确吗?

我认为 OpenID Connect (OIDC) 是一个很好的协议

如果您想将用户身份与应用程序分开,OIDC 和 OAuth 2.0 是最佳选择。这意味着您不会将它们保留在应用程序的末端,而是通过例如 Azure AD、ADFS 甚至 Google。如果您更喜欢基于令牌的身份验证和授权,这也是正确的选择。这意味着您信任由授权服务器(也称为身份提供者或 OP)颁发的令牌,这比通过基本身份验证传递 username/password 更安全。

使用 PKCE 的授权代码流是这里的方法

正确。本机应用程序(例如您正在创建的应用程序)在 windows 用户计算机上运行,​​应使用具有身份验证的 PKCE。代码流。

关于流量

我不确定第二步,After the user logs in, the refresh token and access token are returned using a POST redirect that the application can intercept.我猜你是从授权请求中获取令牌?不确定你在这里的意思,但理想情况下必须发生的是你应该在用户登录浏览器实例后获得授权码。一旦你得到它,你必须直接调用身份提供者的 token 端点。作为此令牌请求的结果,您将获得令牌。它也有 PKCE 完成步骤。

还有The native application uses that access token to get user info and display profile information in the app。为此,您可以使用令牌响应中的 ID 令牌。它包含最终用户信息。请从 protocol's explanation 查看更多内容。

从 API 结束,是的,它必须根据 API 请求附带的访问令牌检查调用的有效性。为此,它可以在第一次看到新的访问令牌时使用 user_info 端点,然后缓存详细信息。在以后的调用中,它可以使用缓存的信息来检测用户信息。此外,一些 OP 会发送基于 JWT 的访问令牌,您的 API 可以读取这些令牌并检测过期详细信息。

我认为本机客户端在将每个请求发送到 API 之前应该检查 access_token。

不行!它必须是 API 应该做这个检查。否则 API 将盲目接受可以由某些恶意客户端发送的令牌。将此实现到 API 结束,如果访问令牌无效,请发送 401 - 未经授权的响应。