我是OAuth的新手,以前只使用它来向第三方服务进行身份验证。我们目前正在构建一个应用,该应用通过REST API与我们的服务器进行通信。当前,仅通过基本身份验证(以通过HTTP标头发送的API密钥的形式)“保护”此过程。该API密钥在注册后发出,并在每次使用正确的电子邮件和密码向/ login端点发出请求后返回给用户。使用此API密钥,用户可以请求所有其他端点。显然,这不是很安全。
我现在想到了实现OAuth。但是,我仍然有点担心整个概念在某个地方出错,而我创建的流程在某个地方存在安全问题。这是我创建的流程:
基本上,当用户注册时,会向他发送访问令牌,刷新令牌和客户端ID。每个设备的客户端ID是唯一的。访问令牌具有有限的生存期(1小时),并且在存储时是“公共”的,可以由应用轻松检索。刷新令牌直接发送到设备上的安全存储。只能通过额外的身份验证(例如通过Touch ID或Face ID。 现在,当用户拥有有效的访问令牌时,他可以根据需要请求和创建资源。但是,一个小时后该令牌无效。如果用户未激活额外的身份验证,则该小时之后,他需要使用电子邮件和密码重新登录以获得新令牌。 但是,如果他确实有启用面部识别码后,当他打开应用并进行身份验证时,会自动向他发送新的访问权限和刷新令牌(旧令牌已被撤销)。 如果他已经使用该应用程序超过一个小时且访问令牌已过期,则将要求用户通过Face ID重新进行身份验证以获取新令牌。 我还考虑过在从未知位置登录时基于电子邮件和密码的登录实现两要素身份验证(SMS)。
这是有效的OAuth流吗?我觉得我在这里缺少一些关键,特别是在涉及刷新令牌时。 我希望将所有内容保留在应用程序内,而无需外部站点,并希望该应用程序尽可能地方便,而不必每小时输入电子邮件和密码。