【问题标题】:Obtaining AuthProvider for current user on firebase在 firebase 上为当前用户获取 AuthProvider
【发布时间】:2017-05-15 19:47:50
【问题描述】:

我正在尝试检测登录用户的 AuthProvider,以便提供一种使用“reauthenticateWithPopup”重新进行身份验证的简单方法。

最简单的方法是直接从 currentUser 获取对应的 AuthProvider 对象,但是,我认为这是不可能的(如果我错了请纠正我)。

另一种选择是获取 firebase.auth.currenUser.providerId 并执行 switch/case 子句来创建 firebase.auth.AuthProvider。我个人不太喜欢这个选项,因为我必须对字符串进行切换/大小写(例如“google.com”)。不过,这是我能想到的最佳解决方案。

不幸的是,在我实施它时,我意识到 firebase.auth.currenUser.providerId 总是会返回“firebase”,即使我是从谷歌登录或使用电子邮件/密码登录的。这是一个错误吗?我是不是做错了什么?

我可以看到,如果我访问 currentUser.providerData,就会有一个数组,其中包含该用户的所有可用提供程序。但是,这是一个列表,我不确定是否会选择当前使用的列表,以防该用户有多个列表。

附加信息:使用 angularfire2 v4

【问题讨论】:

  • currentUser.providerData中的每个provider都有一个providerId:firebase.auth().currentUser.providerData[0].providerId。您可以使用它来重新验证用户。您还可以提供所有选项来为当前用户重新进行身份验证,并让用户决定使用哪一个。
  • 是的,我就是这么想的。但是,我想知道是否有一种直接的方法可以知道这次用于身份验证的方法。如果用户有多种身份验证方式(例如,该帐户与 google、facebook 等链接),那么应该有一种获取当前身份的方法。

标签: firebase firebase-authentication angularfire2


【解决方案1】:

最简单的方法是遍历 providerData 列表。您还可以使用一些 JWT 解析器解析 Firebase ID 令牌并检查 firebase.sign_in_provider 字段。这将包含用于获取 ID 令牌的身份验证方法:

{
 "iss": "https://securetoken.google.com/PROJECT_ID",
 "aud": "PROJECT_ID",
 "auth_time": 1495126200,
 "user_id": "1234567890",
 "sub": "1234567890",
 "iat": 1495126200,
 "exp": 1495129800,
 "email": "user@example.com",
 "email_verified": true,
 "firebase": {
   "identities": {
     "google.com": [
       "0987654321"
     ],
     "email": [
       "user@example.com"
     ]
   },
   "sign_in_provider": "google.com"
 }
}

【讨论】:

  • 我明白了,我猜 angularfire2 中没有内置函数可以做到这一点?它看起来是一个不错的功能。
【解决方案2】:

这是针对 web 应用程序的?

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});

https://firebase.google.com/docs/auth/web/manage-users

直接从文档中,在你的脚本中检查这个,如果用户登录执行代码,如果没有重定向到注册/登录

【讨论】:

    【解决方案3】:

    要让当前用户登录,试试这个

     import {
          AngularFire,
          AngularFireAuth
        } from 'angularfire2';
    
        constructor(public af: AngularFire) {
          this.af.auth.subscribe(auth => {
            console.log(auth)
          }); 
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2017-04-06
      • 2020-03-29
      • 2021-03-05
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      相关资源
      最近更新 更多