我应该选择哪个 OAuth 2.0 / OpenID Connect 流程?
Which OAuth 2.0 / OpenID Connect flow should I choose?
我有一个场景需要向本机 iOS / Android 应用程序添加身份验证和授权。该应用程序允许商店的员工执行他们的业务操作:
- 每个商店都在服务器上为其创建了一个帐户。
- 同一家商店可以使用多台设备。商店中的所有设备都应访问相同的数据。
- 多个用户(员工)可以使用店内的任何设备。
- 识别执行特定操作的实际用户是在应用程序本身内处理的。
我查看了可用的流程,但我对哪种流程最适合这种情况有点困惑。
- 我考虑过使用 Device Flow,但我不确定在这里做的事情是否正确,因为我知道移动设备不是输入受限的设备(例如健身追踪器或智能电视)。
- 客户端凭据流程也不适合,因为移动设备无法安全地存储秘密,而且因为我不仅要寻找对服务器的授权请求,还要以某种方式验证商店本身,所以我可以return它的具体数据。
- 我只剩下带有 PKCE 流程的授权码,但我仍然不确定这是否是正确的方式,因为我知道我不是在对用户进行身份验证,而是对属于商店的设备进行身份验证。因此,也许我可以将商店本身视为资源所有者,并且在商店中工作的特权个人(可能是商店所有者)将使用此流程对商店进行身份验证。
您认为 (3) 是正确的方法还是推荐其他流程?
我理解这些顾虑,因为您需要在安全性和可管理性之间找到一个中间地带。着眼于满足当前需求但也有良好未来可能性的选项。
首选流程
code flow will be the right choice since it has the best flexibility. Use the AppAuth pattern from RFC8252.
未来的安全保障
从长远来看,要考虑的事情是执行其中一项或两项的能力,这可以通过多种方式完成:
- 识别用户
- 识别设备
代码流允许多种选择:
将您当前的应用内用户标识转换为在代码流中运行的自定义身份验证操作 - 您可以将其用作主要因素,或者可能用作次要因素
将来,商店员工可以通过 WebAuthn key 等用户友好的设备登录,而不是密码
移动应用程序可以存储客户端凭据,如果它在每台设备上都是不同的。在更高安全性的设置中,这可能是一个强大的加密凭证。 mobile best practices 中有更多相关信息。这使您能够识别设备。
当然,您不需要做所有这些,但是使用代码流时工具就存在,添加更高级的安全性通常不需要更改任何代码。
初始推出
棘手的部分是设计一个没有阻塞问题的初始部署。另一种选择可能涉及每个商店 2 个用户帐户 - 一个具有管理员权限 - 并使用简单的密码。
您当然还应该考虑威胁 - 例如,如果其中一名员工执行了恶意操作,如何跟踪用户。
OP提出了两个问题:
Q1。哪种 OAuth 2.0 流程适合本机移动应用程序?
Q2。谁是资源所有者以及如何对他们进行身份验证?
A1。带有 PKCE 的授权码将适用于商店中的本机应用程序。
A2。根据OP提供的信息,store本身就是一个资源拥有者。每个商店都有一个在身份验证服务器中定义的身份,大概有一个凭证,例如一个密码。在这种情况下,所有商店员工都将使用此身份向身份验证服务器进行身份验证。这将简化令牌创建,因为令牌的主题将是商店本身。应用程序将在 OAuth 2.0 交换之外处理员工的身份。这将满足所有员工都可以访问相同 store-wide 数据的要求。这在资源服务器中很容易实现,因为令牌的主题是商店。
应用程序必须锁定为在给定商店中使用单一标识。这将避免在多家商店工作的员工的人为错误。这可以通过多种方式在应用程序级别完成。
商店标识可以由商店管理员在每台设备上简单地配置。
如果设备可以在商店之间轮换,或者如果员工使用个人手机 phone 并且如果他们在商店之间旅行,则该应用程序可以调用 API returns 商店的身份基于商店的 IP 地址。这也会将应用程序的使用限制在内部网络中。
在任何一种情况下,员工在验证身份验证服务器时只需输入商店密码。
我有一个场景需要向本机 iOS / Android 应用程序添加身份验证和授权。该应用程序允许商店的员工执行他们的业务操作:
- 每个商店都在服务器上为其创建了一个帐户。
- 同一家商店可以使用多台设备。商店中的所有设备都应访问相同的数据。
- 多个用户(员工)可以使用店内的任何设备。
- 识别执行特定操作的实际用户是在应用程序本身内处理的。
我查看了可用的流程,但我对哪种流程最适合这种情况有点困惑。
- 我考虑过使用 Device Flow,但我不确定在这里做的事情是否正确,因为我知道移动设备不是输入受限的设备(例如健身追踪器或智能电视)。
- 客户端凭据流程也不适合,因为移动设备无法安全地存储秘密,而且因为我不仅要寻找对服务器的授权请求,还要以某种方式验证商店本身,所以我可以return它的具体数据。
- 我只剩下带有 PKCE 流程的授权码,但我仍然不确定这是否是正确的方式,因为我知道我不是在对用户进行身份验证,而是对属于商店的设备进行身份验证。因此,也许我可以将商店本身视为资源所有者,并且在商店中工作的特权个人(可能是商店所有者)将使用此流程对商店进行身份验证。
您认为 (3) 是正确的方法还是推荐其他流程?
我理解这些顾虑,因为您需要在安全性和可管理性之间找到一个中间地带。着眼于满足当前需求但也有良好未来可能性的选项。
首选流程
code flow will be the right choice since it has the best flexibility. Use the AppAuth pattern from RFC8252.
未来的安全保障
从长远来看,要考虑的事情是执行其中一项或两项的能力,这可以通过多种方式完成:
- 识别用户
- 识别设备
代码流允许多种选择:
将您当前的应用内用户标识转换为在代码流中运行的自定义身份验证操作 - 您可以将其用作主要因素,或者可能用作次要因素
将来,商店员工可以通过 WebAuthn key 等用户友好的设备登录,而不是密码
移动应用程序可以存储客户端凭据,如果它在每台设备上都是不同的。在更高安全性的设置中,这可能是一个强大的加密凭证。 mobile best practices 中有更多相关信息。这使您能够识别设备。
当然,您不需要做所有这些,但是使用代码流时工具就存在,添加更高级的安全性通常不需要更改任何代码。
初始推出
棘手的部分是设计一个没有阻塞问题的初始部署。另一种选择可能涉及每个商店 2 个用户帐户 - 一个具有管理员权限 - 并使用简单的密码。
您当然还应该考虑威胁 - 例如,如果其中一名员工执行了恶意操作,如何跟踪用户。
OP提出了两个问题:
Q1。哪种 OAuth 2.0 流程适合本机移动应用程序?
Q2。谁是资源所有者以及如何对他们进行身份验证?
A1。带有 PKCE 的授权码将适用于商店中的本机应用程序。
A2。根据OP提供的信息,store本身就是一个资源拥有者。每个商店都有一个在身份验证服务器中定义的身份,大概有一个凭证,例如一个密码。在这种情况下,所有商店员工都将使用此身份向身份验证服务器进行身份验证。这将简化令牌创建,因为令牌的主题将是商店本身。应用程序将在 OAuth 2.0 交换之外处理员工的身份。这将满足所有员工都可以访问相同 store-wide 数据的要求。这在资源服务器中很容易实现,因为令牌的主题是商店。
应用程序必须锁定为在给定商店中使用单一标识。这将避免在多家商店工作的员工的人为错误。这可以通过多种方式在应用程序级别完成。
商店标识可以由商店管理员在每台设备上简单地配置。
如果设备可以在商店之间轮换,或者如果员工使用个人手机 phone 并且如果他们在商店之间旅行,则该应用程序可以调用 API returns 商店的身份基于商店的 IP 地址。这也会将应用程序的使用限制在内部网络中。
在任何一种情况下,员工在验证身份验证服务器时只需输入商店密码。