OAuth2 访问令牌不必过期(或者更确切地说,它们确实会过期,但可能会过期很多年)。
访问令牌可以一次用于从资源服务器获取某些资源,特别是它允许获取用户批准的那些资源。另一方面,刷新令牌允许重复访问。因此,如果不要求每次访问之间的用户交互,就无法取消刷新令牌。
但总的来说,令牌有时会被同一设备上的其他恶意应用程序或手机上的 MITM 攻击窃取。如果可以使电话信任不可靠的证书,则 SSL 是 MITM-able。公司有时需要这样做才能访问内部网络(他们需要接受自签名证书,这允许他们对公司网络上发生的所有加密流量进行 MITM。因此假设发送加密令牌意味着它们在途中不会被盗是危险的。
不记名令牌本身并不比任何其他形式的令牌弱,正如一堆论文中所证明的那样(包括我自己的一篇,当我可以挖掘出来时,我会发布链接。)但是,不记名令牌只是适用于他们做出的假设有效的情况。令牌可以保密的假设通常是不记名令牌的主要假设。如果这不是真的,那么不记名令牌不会声明任何安全属性(尽管有些仍然持有)。请参阅NIST Level 3 tokens,它定义了承载令牌必须击败的攻击,如OAuth Bearer Tokens中所述。简而言之,不记名令牌不应该阻止令牌被盗。
不记名令牌不能被撤销,这是真的。然而,鉴于通常的访问模式是在获取后立即使用访问令牌,因此即使当前无法想到滥用案例,也应该相当快地使访问令牌过期以防止潜在的滥用。代币存在的时间越长,被盗的可能性就越大。刷新令牌实际上被盗更危险,因为如果您无法保护客户端 ID,它会在更长的时间范围内提供重复访问。OAuth2 通常可以提供对资源的访问,因此例如可以用于将 API 公开给客户端一段时间。与单次使用令牌相比,使用刷新令牌可以造成更大的伤害。
事实上,客户端身份验证可以通过多种方式变得更加安全,例如,在下载时为每个客户端提供不同的密钥。这可以防止在一个设备上对令牌进行逆向工程破坏客户端所有实例的安全性的普遍攻击。其他可能的技术包括使用 OAuth 向您的服务器验证客户端,然后使用您希望访问的授权服务器执行 OAuth 协议的第二次运行。这样,您就可以让客户端定期更新其密钥,并让它们都拥有不同的密钥,同时不会对 Facebook 或 Google 拥有的授权服务器所使用的系统造成过度负担。
使用移动应用程序时,长期刷新令牌比拥有某种多用途不记名令牌更安全,即使没有采取措施保护客户端。这是因为用户不能使令牌过期。如果刷新令牌没有被盗,并且用户只是希望撤销访问,那么可以这样做。即使用户只是希望撤销访问权限,也不能撤销多用途不记名令牌。多用途数据库引用令牌显然可以被撤销,但这不是协议的设计目的,因此在 OAuth 上执行的安全分析并没有说明这个混合系统的安全性。
总之,我建议使用刷新令牌和数据库令牌,因为这最有可能是安全的。如果您可以做任何事情来保护客户,那将是一个额外的好处,但是这可以防止的情况很少。如果您确实想保护客户端,请考虑使用软令牌,即谷歌身份验证器,因为这是一个可靠的实现,经受住了一些非常聪明的人的分析。