某些应用程序在登录工作流中会存储用户的数据。有很多种方法可以实现这种身份验证和授权,但最简单的方法之一是使用 OAuth2 来借用知名公司的现有账户。OAuth2,或简称 OAuth,是一种开放的访问委托标准,如果你曾使用过某个应用程序的“用 Facebook、GitHub 或 Google 账户登录”功能,你可能已经遇到过它。
OAuth 协议本质上允许我们的 Web 应用程序访问另一个应用程序的登录数据,而无需第三方与我们共享用户的凭据。为此,用户通过创建访问令牌授予我们的应用程序对其第三方账户的访问权限。OAuth 是基于授权的访问委托的公认标准,Amazon、Google、Facebook、Microsoft 和 GitHub 都支持 OAuth 工作流。
本章将向你介绍 OAuth 工作流,然后探讨用于访问委托的 Bearer 令牌的结构,为在第二部分将 OAuth2 实现到你的 Food Finder 应用程序中奠定基础。在第九章的练习中,我们不会用 OAuth 流程更新示例的 Next.js 应用程序,而是手动演练 OAuth 授权过程。
OAuth 是如何工作的
在我们探索 OAuth 之前,你需要了解身份验证和授权之间的区别。简而言之,我们使用身份验证来验证用户的身份,而授权则指定经过身份验证的用户拥有的权限并执行这些权限。OAuth 允许将该过程委托给用户已经拥有账户的第三方,从而简化用户的登录过程。
身份验证与授权
每次应用程序收到登录请求时,它会在允许访问之前检查用户的凭据,这个过程称为身份验证。通常,这些凭据包括用户名和密码,但也可能是硬件令牌或涉及生物识别因素,如指纹或面部识别。然后,应用程序验证这些凭据是否与数据库中存储的凭据匹配。
最简单的身份验证形式是单因素身份验证,它只需要一个因素,通常是密码。不幸的是,它也是实现身份验证的最不安全的方法。一种更强大且推荐的形式是多因素身份验证,其中用户必须提供至少两个因素。这些因素可能是用户知道的,如密码,用户拥有的,如物理令牌,或者用户本身,如指纹所有者。当你登录 PayPal 或 Google 时,可能会使用多因素身份验证,这两者都需要你提供密码和一个额外的一次性密码(OTP)。
一次性密码(OTP)是基于你和应用程序之间共享的秘密创建的代码,当你注册账户时。两者在短时间间隔内重新生成一对。你的 OTP 可能由认证应用程序(如 Google Authenticator)生成,或者通过短信接收。你拥有账户的应用程序(例如,PayPal 或 Google)生成自己