我正在使用Node.JS/Express构建一个网站.JS这将允许用户使用第三方提供商(通过OAuth1.0a的Discogs)登录。
我已经成功实施了身份验证过程,以便用户授予对其 Discogs 帐户的访问权限,并且我会收到一个访问令牌,以供将来的 API 调用。访问令牌不会过期。该用户被Discogs归类为"经过身份验证的应用程序"。
目前,我将访问令牌存储在会话中,即使用户重新启动浏览器或重新启动服务器,该会话仍然存在,因此用户保持登录状态。伟大。
但是,当我通过销毁用户的会话将用户注销并重复身份验证过程时,第三方提供商会将用户视为新授权的应用程序,而将旧的授权应用程序抛在后面。我该如何解决这个问题?注销时不销毁用户的会话,而是存储用户的登录状态是否更好?迪斯科不提供取消身份验证的方法。
此外,用户登录后,还需要针对用户设置一些配置。我应该为此创建一个专用的数据库表或等效表,还是将其存储在会话中就足够了?似乎专用的用户表可能是多余的,因为我依靠用户的会话ID来识别它们。
通常,您可能希望将有关用户的一些信息永久保存在您自己的服务器上,因此可能保存在数据库中。
在您的特定情况下,该数据库可能应该保存您从 Discogs 获得的某种唯一用户 ID(出于安全原因,请勿保存访问令牌本身),您可以在后续登录时使用该 ID 来识别哪些访问令牌属于同一用户。
您的流程可能是这样的:
- 用户首次通过 Discogs 登录,您将获得一个访问令牌,将其放入会话中
- 您以某种方式找出一个唯一的用户ID,并将其与可能需要的任何其他用户信息一起保存到数据库中
- 您也可以将该 ID 放入会话中
- 用户注销,您销毁会话,但将信息保留在数据库中
- 用户再次通过 Discogs 登录,您将获得不同的访问令牌,将其放入会话中
- 您找出与数据库中的 ID 匹配的唯一用户 ID,因此将该 ID 写入会话 - 现在您可以将用户视为同一用户,只是使用不同的访问令牌
唯一用户 ID 可以是您猜对的任何唯一用户 ID。可能是实际的ID,用户名或电子邮件地址 - 我不熟悉Discogs,但我相信您可以弄清楚一些东西以及如何获得它。