我目前正在为我正在构建的某些应用实施OpenID Connect身份验证系统,其中一个客户端是本机移动应用。在阅读了使用OpenID Connect与本机客户端的不同选项之后,很明显当前的行业建议是使用混合流(即显示嵌入式浏览器来收集用户的凭据,然后为应用程序发出令牌以供使用)。另一种方法是使用资源所有者流,它具有更好的用户体验,因为凭据是在应用程序内部收集的。但出于以下两个主要原因,这似乎令人沮丧:
这意味着本机客户端将收集凭据 - 因此本机客户端有机会保存凭据或对其进行恶意处理。在我们的例子中,我们自己创建本地客户端,所以这不是一个问题。我们不会将身份验证系统开放给其他应用程序使用。
由于资源所有者流来自OAuth 2规范,而不是OpenID Connect,因此缺少其他流的重放攻击防范功能。具体来说,有人可以记录身份验证过程,然后自己重播,以便从我们的身份服务器获取用户令牌。
由于问题1在我们的案例中不是问题,我想要了解的是,是否有办法通过使用某种类型的随机数/临时令牌向资源所有者流添加重放攻击防范。我想到的场景是:应用程序将从身份服务器请求一个nonce,其中包括某种时间戳或该请求的其他唯一标识符;然后,应用程序需要向该随机数提供身份验证请求;身份服务器将在允许处理身份验证请求之前验证nonce。这样,如果有人能够重播整个消息,服务器就会发现nonce无效并拒绝认证请求。
攻击者可能会自己从服务器请求nonce,但是他们需要解密(HTTPS)身份验证请求才能替换原始消息的nonce他们生成了新的nonce。
我的问题是:
在这种情况下资源所有者流程不是一个好主意还有其他原因吗?
如果我们确实使用了资源所有者流程,那么我所描述的nonce方法是否是避免重放攻击的好方法?