具有Touch ID的OAuth2应用

时间:2017-08-22 19:38:06

标签: oauth-2.0 touch-id

第三方应用是否可以通过逻辑方式使用Touch ID对使用OAuth2的网络服务进行身份验证?

假设我拥有一个需要使用OAuth2进行身份验证的Web服务。它同时支持implicit and authorization-code grants(尽管我可以在必要时添加对其他授权的支持)。

第三方拥有使用此网络服务的移动应用。它会打开一个本地Web视图进行身份验证,并在其中加载我的身份验证URL。用户在我的域中输入用户名/密码,然后将OAuth令牌返回给应用程序。

如果此应用想要实施Touch ID以加快身份验证,有没有办法在OAuth2中做到这一点?

我的理解是,OAuth2隐式代码和授权代码授权的目的是阻止父应用程序访问用户的凭据。它只能访问生成的OAuth令牌,并且只能在有限的时间内有效。

使用Touch ID,您通常会使用Keychain Services存储密码。所以这显然要求您有权访问密码。

我认为他们可以将OAuth令牌存储在钥匙串中而不是密码中,但这只会在短时间内生效。

2 个答案:

答案 0 :(得分:1)

我还不知道任何标准流程,但这是一些常见的注意事项。简单地存储长期凭证(密码或刷新令牌,甚至在静态时进行加密)将以难以审核的方式混淆安全上下文。使用任何本地身份验证(特定于应用程序的解锁PIN,任何生物特征识别符或仅是系统解锁)时,以一种可以由服务器验证的方式进行验证很重要。因此,第一步将是设备身份验证,您的应用程序的每个实例都应使用唯一的客户端ID /客户端凭据(我建议实施Dynamic Client Registration Protocol来帮助实现这一点,但可能还有其他选择)。然后,一个好主意是直接在设备上生成一些可验证的密钥信息,将其放入安全存储(受任何本地解锁机制保护,并在生物特征更改时无效,或者),并使用它生成某种类型的MAC,例如例如作为jwt-bearer flow(或OAuth断言框架的一些新扩展)一部分的JWT。 JWT令牌可以包含其他元数据(声明),这些元数据可以为服务器提供更多上下文,就像它可以在某些情况下做出明智的决定以强制重新认证一样。

要重述:

  1. 设备被授权并颁发了唯一的客户端凭据对。
  2. 本地生成的密钥将保存到加密存储中,并受到某些本地解锁机制(系统锁定屏幕,PIN,生物识别等)的保护
  3. 密钥已在服务器上注册并绑定到设备。
  4. 在解锁时,密钥用于生成JWT,该JWT用作断言以与服务器进行身份验证。

对我来说似乎很标准,也许有人在考虑了所有实现细节,当前实践和安全考虑之后,应该为此编写一个BCP。

答案 1 :(得分:0)

到目前为止,我唯一想出的答案就是您最后提到的内容:存储OAuth令牌-而且还有一个长寿的刷新令牌。刷新令牌可以生存多长时间肯定取决于您的特定安全需求。