我的回答可能不是最好的,但它应该能让你开始。
假设您有一个包含字段的用户表
user_id
user_email
user_salt
user_password
user_vtoken
当您首次注册用户时,系统会提示他们输入电子邮件和密码。
你应该做的是首先通过生成一个随机字符串(例如hoasyfgq39247t)来加盐密码,将其附加到密码的末尾(比如密码是“qwerty123”,它会变成“qwertyhoasyfgq39247t”)。然后你用你喜欢的任何东西(password_hash php函数,SHA3等)对加盐密码进行哈希处理,它应该给你一个一定长度的字符串(你可以在哈希时指定长度)。
将电子邮件、散列/加盐密码和盐本身发送到您的服务器,在那里它创建一个具有唯一 user_id 的用户对象/行。您可以将 user_vtoken 默认为一些随机字符串(在创建用户时不要将其留空)。
现在,当用户第一次登录时,他们会输入他们的电子邮件和密码。您应该首先向您的服务器发送一个请求,以检索附加到用户电子邮件中的“salt”。获得盐后,将其附加到他们输入的密码中,并使用他们登录时使用的相同算法对其进行哈希处理。那应该给你一个散列/加盐的字符串。将电子邮件和散列/加盐字符串发送到您的服务器并进行比较。如果散列密码与您存储在数据库中的密码匹配,则它们已通过身份验证。一旦发生这种情况,让服务器生成一个新的 user_vtoken(每次用户登录时都执行此操作)并将其返回给您的应用程序。
一旦您的应用程序获得 user_vtoken,请将其存储在某处。现在,对于您对服务器的每个后续调用,包括 user_email/user_vtoken 组合(如果您在登录时返回 user_id,您也可以执行 user_id/user_vtoken 组合)。如果由于任何原因身份验证失败,请确保发回正确的错误代码并强制用户退出应用程序并将其带回登录屏幕。
如果您不希望用户在应用重启时重新登录,您可以将 user_id/user_vtoken 存储在应用的持久内存中。
何时重置 user_vtoken
您需要在每次用户登录和每次用户注销时重置服务器端的 user_vtoken。这将在技术上注销当前登录到应用程序的任何人,因为他们存储的 user_vtoken 不再有效
user_vtoken 是否应该过期?
这取决于你。如果需要,您可以在每次生成新的 user_vtoken 时设置 user_vtoken_expiry 字段。当用户尝试使用过期的 user_vtoken 进行身份验证时,您可以强制他们重新登录。我通常从不这样做,因为这对用户来说很烦人,并且并没有真正让事情变得更加安全。您可能不希望每次用户使用一个身份验证时都生成一个新的 user_vtoken,因为它不提供任何额外的安全性,并且如果您的用户从不同的设备登录,您的应用程序将无法使用。
加盐/散列是怎么回事
您永远都不想在数据库中存储实际密码。仍然有数量惊人的白痴存储用户的实际密码,然后他们被破解,所有的地狱都崩溃了。事实上,您可能永远不希望实际密码离开客户端。在散列密码之前对密码加盐还可以防止人们在您被破解时使用预编译的字典对您的密码进行反散列处理。
更安全
通过 HTTPS 传递您的请求还可以降低您遭受中间人攻击的风险。如果您检测到来自新设备的新登录,您可能会变得更加严肃,并需要两步授权(通过短信或额外问题)。
使用 Oauth?
OAuth 非常强大,但如果您不熟悉这一切,则实施起来有点困难。自己构建可能会容易得多。
希望这会有所帮助。