用于社交登录的身份验证库

时间:2021-02-05 04:10:50

标签: javascript authentication oauth social

我正在尝试向我的网络应用添加身份验证。

理想的流程是受保护的页面只能由拥有特定电子邮件地址的人访问。他们可以使用任何社交登录(Google、LinkedIn 等)来证明自己的身份

我只需要从这些平台获取用户的电子邮件地址。我不是为每个提供者自己构建它,而是寻找一个 npm 包或类似的包来做到这一点。

我遇到了 auth0,但是

  1. 它们不是免费的
  2. 我不需要在他们的数据库中创建用户的第 3 方服务器端。事实上,我根本不会用这个流程创建用户,它只是为了身份验证。

我很高兴为每个平台生成我自己的客户端 ID 和机密,并将它们插入到配置文件中。

我也不需要为验证显示我的品牌,我很乐意在身份验证屏幕上使用第 3 方名称(只要他们是众所周知的)。

这是一个要求,将 oauth 范围限制为仅读取用户的个人资料信息,而不是其他任何内容。

我有哪些选择?

4 个答案:

答案 0 :(得分:1)

如果您愿意建立一个专门的安全应用程序来处理所有社交媒体,您可以考虑开放自由服务器,它可以处理任何基于 oauth 2.0 或 OIDC 的社交媒体的身份验证。 https://openliberty.io/guides/social-media-login.html

答案 1 :(得分:1)

与上述解决方案不同,它没有列出所有社交登录的库。

但是,简单的答案是护照。

编辑:以下链接无效,请使用 https://www.passportjs.org

https://passportjs.org/ https://passportjs.org/packages/

支持 discord、google、twitter、facebook 等 500 多个

搜索它http://www.passportjs.org/packages/

如果这解决了您的问题,请接受我的回答。 谢谢:)

(如果这对您没有帮助,请发表评论,我会修复它)

编辑:npm install passport

document.getElementById('bye').onclick = function(){
location.replace("google.com/search?q=" + document.getElementById("bye").value)
}
<input id='hi' placeholder="Goole search">
<button id='bye'>Submit</button>

答案 2 :(得分:0)

最好的免费解决方案是使用 firebase 身份验证。只需创建一个项目并为您喜欢的任何平台(例如 google、facebook、github 等)启用身份验证。

https://firebase.google.com/docs/auth/web/start

答案 3 :(得分:-1)

OAuth2

大多数网络服务通过 OAuth2 支持社交登录,这是一种标准化的授权协议。它本身非常广泛,但对于您的用例,您只需要知道客户端如何与服务器交互。在本例中,我们查看的是 authorization code grant type

您可以使用来自 npm 的标准 oauth 库,例如 oauth,并为您想要手动支持的每个提供程序配置值。这是一个 example of OAuthenticator,它是一个 Python 库。该页面显示了如何设置身份验证器类以及感兴趣的属性。
例如,对于作为身份提供商的 AWS Cognito,没有实现任何自定义类来处理奇特的逻辑。这几乎都是相同的原则,但价值不同。您可以使用正确的参数配置通用身份验证器以执行您想要的操作。

提供商信息

因此对于每个提供商(Google、Github、Discord 等),您需要了解

  • 第一个请求的 authorization_url
  • 第二个请求的 token_url
  • 一组您可以查询的scopes
  • 给定访问令牌的 userinfo_url 端点,您可以调用该端点以获取当前用户的更多信息
  • 一种从从 email 获得的响应中提取资源(例如 userinfo_url)的方法

您通常可以在相应提供商的文档页面中找到所有这些值。

申请信息

然后,您的应用程序需要具有

  • 用于标识您的应用程序的 client_id
  • 应该保密的client_secret
  • 想要查询的一组scopes(例如用于访问电子邮件地址的电子邮件、用于访问名字和姓氏的个人资料)
  • 身份提供者将向其发送 POST 请求的 redirect_uri,传达您的应用可以交换访问令牌的 code,前提是您了解 client_secret

这些值由您作为应用程序的开发者设置。您从提供商处获取 client_idclient_secretredirect_uri 应指向您应用的后端。

OpenID 连接

最后,虽然使用 OAuth2 对授权进行了标准化,但之后如何提取信息还不是(还)。所以你现在有一个访问令牌 - 好的,现在怎么办?如何获取用户的资源(如emailprofile_image等)不清楚,依赖于提供者。
为此,有一个名为 OpenID Connect (OIDC) 的协议,它标准化了如何获取用户信息。许多 OAuth2 提供商也支持 OIDC 并为您提供 userinfo endpoint、ID 令牌等。

示例:不和谐

有关具体示例,请查看 OAuth2 guide from Discord,它为您提供了一些有关如何自己实现事物的有用指示(例如,使用 axios 或任何其他 HTTP 库)。在 Discord 的情况下,授权用户的典型工作流程是

  • 您的应用将用户重定向到 Discord 的 authorization_url
  • 用户登录 Discord 并同意
  • Discord 向您在 discord 注册 OAuth 客户端时设置的 redirect_uri 发送 POST 请求。在请求正文中,您将找到授权 code
  • 您的后端将代码交换为访问令牌。为此,它使用 token_urlclient_idclient_secret(以及一些附加信息)调用 code
  • Discord 使用您存储在某处的访问令牌进行响应
  • 对于每个后续请求,您都可以访问用户的资源(例如电子邮件、个人资料图片等)。您可以通过在请求中提供 Authorization: Bearer <token> 标头来向 Discord 发出信号
  • 一个示例:通过调用 Discord's userinfo_url 查找用户的电子邮件地址。您可以从响应中提取 email 属性。