在一个项目中使用多个应用程序进行Firebase身份验证

在一个项目中使用多个应用程序进行Firebase身份验证,firebase,firebase-authentication,access-token,Firebase,Firebase Authentication,Access Token,我有一个firebase项目,其中有两个应用程序。客户端应用程序和服务提供商应用程序。两者都使用firebase电话认证。 每个用户都可以注册为拥有相同电话号码的客户或服务提供商。 在服务器端,我可以从已发送的令牌(每个应用程序的令牌不同)获取用户id(两个应用程序的用户id相同)。我不知道如何检索的是令牌属于哪个应用程序中的用户? 例如,当应用程序向服务器发送请求以获取登录用户的配置文件信息时,它会向服务器发送令牌。现在,我如何确定是否应该返回客户端应用程序或服务提供商应用程序的用户配置文件信

我有一个firebase项目,其中有两个应用程序。客户端应用程序和服务提供商应用程序。两者都使用firebase电话认证。 每个用户都可以注册为拥有相同电话号码的客户或服务提供商。 在服务器端,我可以从已发送的令牌(每个应用程序的令牌不同)获取用户id(两个应用程序的用户id相同)。我不知道如何检索的是令牌属于哪个应用程序中的用户?
例如,当应用程序向服务器发送请求以获取登录用户的配置文件信息时,它会向服务器发送令牌。现在,我如何确定是否应该返回客户端应用程序或服务提供商应用程序的用户配置文件信息。这是两种截然不同的剖面模型

您可以使用自定义用户声明将用户与客户端应用程序或服务提供商应用程序区分开来:

您可以使用Firebase Admin SDK设置自定义声明:

admin.auth().setCustomUserClaims(uid, {role: 'client'|'provider'})
您将在规则中强制访问。例如:

{
  "rules": {
    "providerContent": {
      ".read": "auth.token.role === 'provider'",
      ".write": "auth.token.role === 'provider'",
    },
    "clientContent": {
      ".read": "auth.token.role === 'client'",
      ".write": "auth.token.role === 'client'",
    }
  }
}
您可以按如下方式宣传您的主张:


您需要在客户端强制刷新令牌。

两个应用程序都可以有单独的根元素。在每个应用程序中,请参阅
approt/uid
元素,其中
approt
是用户访问数据库的应用程序。因为这两个应用程序的配置文件模型不同,所以这应该不是问题。@MayankVerma我也这么做了
/client/profile/id
/provider/profile/id
是获取每个应用程序的配置文件的路径。我想也许有一种方法可以获得生成代币的应用程序,那么如果你实现了你想要的呢?这有什么区别?在我看来,您仍然必须为不同的应用程序维护单独的元素。@MayankVerma,因为在每个请求中,除了
令牌之外,我还必须从客户端发送
appType
。当我能够从令牌中检索应用程序类型时,无需在每次请求时发送
appType
。我会尝试一下,让您知道它似乎来自iOS设备,我无法访问admin SDK。如果为true,则无法从客户端为经过身份验证的用户设置自定义角色,也无法从服务器端进行检查。任何提示?管理员SDK只能从后端服务器访问。不应从客户端设备使用它。在通过AdminSDK在服务器上设置角色之前,您需要向服务器发送一个请求并提供一些证据。例如,从提供商应用程序登录后,您发送ID令牌和某个标志(例如“提供商”到您的服务器),表明请求来自提供商应用程序,验证ID令牌,然后将该角色设置为该用户关联的
uid
。这是一种天真的方法。我使用以下方法从客户端获取经过身份验证的用户:`Auth.Auth().sign(with:credential){(user,error)in`适用于现有用户和新用户。如果现有用户已签入,或者Firebase已创建新用户,然后登录该用户,则可能有何区别?使用带有
签名和RetrieveDataWithCredential:completion:
的最新版本。它返回一个
AuthDataResultCallback
,为您提供一个
附加用户info
具有关于用户是新用户还是现有用户的
newUser
Bool: