使用密码和访问+刷新令牌进行身份验证

Authentication with a password and access + refresh tokens

我目前正在开发一个应用程序,刚刚获得身份验证 API。而且,我有点困惑。主要是关于为什么 API 在使用访问和刷新令牌时使用密码。

API(为简单起见)有四个端点。 /register/verify/refreshToken/login.

身份验证过程是无密码的(对于用户)。您通过短信获得 OTP 代码。

  1. 该过程从用户输入 his/her phone 号码开始。然后,应用程序应在后台生成一个密码,并存储该密码供以后使用。之后使用 phone 号码和密码调用 /register。然后服务器向用户的 phone.

    发送短信 OTP 代码
  2. 用户输入一次性密码。然后使用 OTP 代码和存储的密码调用 /verify。此调用 returns 访问和刷新令牌。

/refreshToken 当访问令牌过期时,调用 /refreshToken。它从存储中获取 phone 号码、刷新令牌和密码。服务器 returns 一个新的访问和刷新令牌。

/登录 即使刷新已过期(它会很快完成),应用程序也会调用 /login。它从存储中获取 phone 号码和密码。然后服务器 returns 一个新的访问和刷新令牌。

我有多个关于 API 的问题。

  1. 首先,它使用由应用程序生成的用户不知道的密码。这意味着,当用户重置 his/her 设备时,应用程序需要生成新密码。这可以使用 OTP 代码来完成,不过。

  2. /login 端点使 /refreshToken 端点无用并且即使刷新令牌已过期。在我看来,这完全绕过了代币背后的概念。

  3. /refreshToken端点也需要密码。

  4. token的目的不就是不需要密码重新认证吗?

我对身份验证不太熟悉。 API 是我不明白吗?

我也在和制作 API 的开发人员交谈。我只是想在这里征求第三意见。

感谢您的帮助。我希望我能够解释这些问题:)

首先我想说的是,不同的应用程序对身份验证有不同的安全要求,因此某些应用程序可以接受的内容可能对其他人不可接受。话虽如此,让我们试着理解这里发生了什么:

  1. 首先,你命名为密码的东西并不是真正的密码。它是客户端和服务器之间共享的秘密。这是有道理的,因为它保护 SMS 通道免受 MitM 攻击(意思是:即使有人获取 OTP 代码,他也将无法登录)。
  2. 拥有访问和刷新令牌很有意义。我们通常交换 credentials/MFA-secrets/biometrics 来获取访问和刷新令牌。
  3. 存储 password-secret 并重用它来重新生成令牌的可能性是错误的,因为我们目前看到的系统架构。它完全不需要刷新令牌。突然之间似乎有一个静态的秘密可以重新生成这一切。这也使得这里并不真正需要 SMS 通道。