我试图了解如何在以下用例中使用OpenId Connect。假设我们只有以下3个组件:
- 带有暴露API (Service Provider aka SP)的Web应用。
- 一个单独的身份验证服务器(标识提供者又名IDP)用于与上述SP进行SSO。
- 终端用户使用的本地客户端应用。这个客户端应用程序使用SP的API。
所有的流量将通过HTTPS。以下是我设想的OpenID连接过程的工作方式:
- 原生应用会向SP请求一个"令牌"。
- SP将看到用户未经过身份验证并请求来自受信任IDP的验证。
- 将用户的凭据提供给IDP后,IDP将向SP返回一个ID令牌和访问令牌。
- SP将验证ID令牌并将访问令牌给本地客户端应用程序,用于所有后续对API的请求。
这是在这种情况下使用OpenID连接的推荐方法吗?有明显的安全隐患吗?我唯一看到的是本地客户端应用程序可以使用Access令牌访问IDP上的User Info端点。
关于第1 - 4点:
-
从IDP而不是SP请求令牌(通常IDP托管在单独的子域上)。我喜欢STS术语(安全令牌服务)而不是IDP,它很容易描述OIDC服务器的角色:发布令牌的软件。
-
我更愿意说:从原生应用到SP的每个请求,都是受保护的(不是匿名的),必须由STS/IDP验证。
IDP是受保护的资源/API/SP和原生应用/RP/客户端之间的防火墙。 IDP响应取决于正在使用的流(代码、隐式、混合、资源所有者、客户端凭证)。这个要点可能有助于快速理解流:OIDC和OAuth2流
设计并打算由客户端/RP/本机应用程序使用的ID令牌。
我认为所描述的用例是非常常见的由OpenIDConnect+OAuth2处理。关于访问用户信息端点,它完全取决于你的IDP配置和RP/Client/NativeApp配置。
的例子:我使用IdentityServer3作为IDP/STS(其官方认证的OpenID连接提供商):在IdentityServer3中,我可以通过配置禁用任何端点并限制RP范围。
总结:我认为用例是推荐的,正如您总结的那样。唯一的问题是我在上面强调的一些误解。但最重要的是不要选择错误的流程或通过错误配置滥用标准。