【问题标题】:How to use my firebase authentication to work with external services?如何使用我的 Firebase 身份验证来处理外部服务?
【发布时间】:2021-06-28 13:09:35
【问题描述】:

好的,我使用 firebase 作为 iOS 应用的身份验证。现在我计划使用称为 connectyCube 的外部服务向我的应用程序添加视频通话。该服务有自己的身份验证系统,除非用户经过身份验证,否则我无法使用他们的服务。

  • 选项 1:我可以使用他们自己的身份验证,这意味着我的应用将有两个身份验证系统 - 效率不高
  • 选项 2:他们说我可以使用现有的身份验证来验证用户

我知道这在开发人员世界中很常见,我看到 OAuth 和 JWT 这个词被抛出,但我是一名新手开发人员,我想了解如何使用 firebase 并从外部服务对用户进行身份验证.

这些是他们在我选择“我有自己的身份验证”选项时提出的问题:

  1. 您的终点网址是什么
  2. 是 GET 还是 POST
  3. 请求标头
  4. 请求参数
  5. 响应参数

我在哪里可以从 firebase 获得所有这些信息?任何帮助都会很棒

【问题讨论】:

    标签: firebase google-cloud-firestore firebase-authentication


    【解决方案1】:

    作为@Dharmaraj'sanswer 的替代方案,您可以基于code sample they've provided 使用HTTP Event Cloud Function

    使用此方法,您可以创建供 ConnectyCube 使用的端点 /verifyUserToken

    import * as functions from "firebase-functions";
    import * as admin from "firebase-admin";
    
    admin.initializeApp();
    
    export const verifyUserToken = functions.https.onRequest((req, res) => {
      const idToken = req.query.token;
    
      verifyUser(idToken)
        .then(
          (userData) => {
            res.status(200).json(userData)
          },
          (err) => {
            console.log("Token verification failed.", err.code || err.message);
            res.status(422).json({error: "User token is invalid"})
          }
        )
        .catch((err) => console.error("Unexpected crash", err));
    });
    
    async function verifyUser(token) {
    
      if (!token)
        throw new Error("token missing");
    
      // using `true` here to force token to be checked against the Firebase
      // Auth API rather than trusting its contents as-is
      const { uid, email } = await admin.auth().verifyIdToken(token, true);
    
      // pull the user's username from their user data
      // at /users/{userId}/username
      const username = (await admin.database().ref("users/" + uid + "/username")).val();
    
      // use user's actual email if available, otherwise fallback
      // to a userID based email
      const uEmail = email || uid + "@users.noreply.yourapp.com";
    
      // use user's username if available, otherwise fallback to
      // the email address above.
      const uLogin = username !== null ? username : uEmail; 
    
      return {
        uid,
        login: uLogin,
        email: uEmail,
        user: {id: uid, login: uLogin, email: uEmail}, // <- this part in particular is used by ConnectyCube
        users: [{uid, login: uLogin, email: uEmail}]
      };
    }
    

    部署后,您将使用以下设置:

    Setting Value
    API URL: https://us-central1-PROJECT-ID.cloudfunctions.net/verifyUserToken
    GET/POST GET
    Request params: {"token": "#{login}"}
    Response params: {"uid": "#{user.id}", "email": #{user.email}, "login": "#{user.login}"}

    【讨论】:

    • 非常感谢您的时间和精力。我将尝试实现这一点以及@dharmaraj 推荐的内容,看看效果如何。将更新利弊
    【解决方案2】:

    看起来 ConnectyCube 使用了他们自己的用户名和密码在其documentation 中提到的某种会话令牌。

    最简单的方法是在新用户使用 Firebase Auth Triggers 在您的 Firebase 应用中注册 Cloud 功能时创建一个 ConnectyCube 帐户。然后您可以代表您的用户生成用户名和密码并将它们存储在数据库中。

    因此,每当您需要创建 ConnectyCube 会话时,请检查当前登录的用户并获取他们的 ConnectyCube 凭据。

    async function createCCSession() {
      const userId = firebase.auth().currentUser.uid
      const ccCrednetials = (await firebase.database().ref(`ccCreds/${userId}`).once('value')).val()
      
      ConnectyCube.createSession(ccCredentials)
        .then((session) => {
          console.log(session)
          return session
        }).catch((error) => console.log(error));
    }
    

    您可以使用security rules 保护数据库,因此用户只能访问他们的凭据。

    {
      "rules": {
        "ccCreds": {
          "$uid": {
            ".read": "$uid === auth.uid"
          }
        }
      }
    }
    

    【讨论】:

    • 我确实考虑过使用身份验证触发器。我可能会执行它,看看效果如何
    • 非常感谢您的时间和精力... :)
    • @Archid ?。最后,它归结为您是否真的需要每次都使用云功能来获取用户的凭证,或者一次身份验证触发器就足以满足数据库成本。您可以使用 Callable functions 为您验证 Firebase 用户..
    • @Archid 虽然我的意思是使用(数据库+函数)比仅使用(数据库)增加了更多成本。
    • @Archid 很高兴听到这个消息。如果方便的话,您甚至可以在自定义声明中存储一些信息(不是密码)。
    【解决方案3】:

    虽然我通常不会重复回答问题,但在探索其他一些与身份验证相关的问题的过程中,我已经设法完全消除了 my other answer 中的云函数,而是直接调用身份验证 API。

    Setting Value
    API URL: https://www.googleapis.com/identitytoolkit/v3/relyingparty/getAccountInfo?key=FIREBASE_CONFIG_API_KEY
    GET/POST POST
    Request params: {"idToken": "#{login}"}
    Response params: {"uid": "#{users.0.localId}", "email": #{users.0.email}, "full_name": "#{users.0.displayName}"}

    在您的客户端上,您只需使用以下数据调用 ConnectyCube 登录 API:

    POST https://api.connectycube.com/login
    login=<Firebase-ID-token>
    password=<any-random-value-to-pass-the-validation>
    

    【讨论】:

      猜你喜欢
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 2012-09-06
      • 2019-05-22
      相关资源
      最近更新 更多