auth
Clear Misconceptions

易混淆的概念

登录与认证的区分

这里需要明确的是,认证是一种独立的行为,并不是只有在登录这个契机才会发生用户认证。实际上在你更改手机号,邮箱,密码的时候也会要求你进行认证,这是为了进一步地保证你身份的可靠性。甚至于在你访问任何接口时,都会要求你进行认证,只不过此时的认证方式不再是要求用户手动输入凭证,而是靠accessToken这种客户端自己携带的凭证去进行认证。

accessToken的引入

那么这里又引入了一个新的问题,为什么不直接用手动输入的凭证进行认证,而还需要 accessToken 这一形式作为中介去呢?你可能会得出一个比较明显的结论是,手动输入的凭证较为麻烦, accessToken 不需要每次手动输入而是自动携带,但这还不够,我可以反驳说为什么不直接存 用户名&密码 在客户端免去手动输入的麻烦呢,谈到这里就会自然而然的发现其中的差异从而引出另一概念 refreshToken

refreshToken的引入

用户名&密码 这类凭证它在服务器中存在的时间是永久的,而 accessToken 这类凭证的有效期是有限的,一旦过期就需要重新获取。但 用户名&密码 这类凭证相较于 accessToken 会更好记忆。从安全性上讲,存储在用户脑子里的凭证是最安全的,因为只要用户不说,它就不会被其他人知道;其次是存储在客户端上的凭证,它相较于前者来说安全性更低,因为它可以被任何能接触到你客户端的人获取到,所以为了提高安全性,就需要增加凭证的复杂度以及减少凭证存在的时间(即有效期);最后就是存储在客户端且需要频繁在网络上进行传播的凭证,这类凭证的安全性是最低,因为它还可以被任何监听网络的人截取到(当然这里可以用SSL协议有效防止),为此还需进一步降低此类凭证的有效期。前两种凭证就是之前说的 用户名&密码accessToken ,而 refreshToken 就是为了解决第三种情况而产生的。

常规登录流程

故一个常规的登录流程应该是,通过 用户名&密码 或第三方凭证( 手机&验证码邮箱&验证码微信授权码 )换取 accessTokenrefreshTokenaccessToken 的有效期大约5分钟, refreshToken 的有效期大约30天, accessToken 过期后需要通过 refreshToken 换取新的 accessTokenrefreshToken 过期后则需要重新登录。最后请求接口时带上 accessToken 即可。但在本后端为了简化流程,并未采取 refreshTokenaccessToken 的有效期变为30天。