簡體   English   中英

Firebase:如何在 onCreate 中獲取附加用戶信息 Firebase 雲 function

[英]Firebase: how to get getAdditionalUserInfo in onCreate Firebase Cloud function

我正在嘗試從 SAML 登錄提供程序獲取一些額外的數據。 我可以在客戶端中看到這些數據,但我看不到如何在后端(firebase 函數)中獲取這些數據。

我在 FE 中使用這些

"firebase": "^9.8.2",
"firebase-functions": "^3.14.1",

而這在 BE

"firebase-admin": "^10.2.0",
"firebase-functions": "^3.21.2",

這是數據以及我如何在客戶端中獲取它:

async myproviderSignIn() {
  const provider = new SAMLAuthProvider('saml.myprovider');
  const auth = getAuth();

  const userCredential = await signInWithPopup(auth, provider);
  const credential = SAMLAuthProvider.credentialFromResult(userCredential);

  if (!environment.production) {
    console.log('User:', userCredential, credential);
    console.log(
      'getAdditionalUserInfo:',
      getAdditionalUserInfo(userCredential)
    );
  }
}

這就是我所追求的並由客戶端中的 getAdditionalUserInfo 記錄:

{
    "isNewUser": false,
    "providerId": "saml.myprovider",
    "profile": {
        "urn:schac:attribute-def:schacPersonalUniqueCode": "urn:schac:personalUniqueCode:nl:local:diy.myproviderconext.nl:studentid:123456",
        "urn:oid:1.3.6.1.4.1.25178.1.2.9": "diy.myproviderconext.nl",
        "urn:oid:1.3.6.1.4.1.25178.1.2.14": "urn:schac:personalUniqueCode:nl:local:diy.myproviderconext.nl:studentid:123456",
        "urn:oid:0.9.2342.19200300.100.1.3": "student1@diy.myproviderconext.nl",
        "urn:oid:1.3.6.1.4.1.5923.1.1.1.1": [
            "student",
            "employee",
            "staff",
            "member"
        ],
        "urn:mace:dir:attribute-def:eduPersonAffiliation": [
            "student",
            "employee",
            "staff",
            "member"
        ],
        "urn:mace:dir:attribute-def:sn": "One",
        "urn:mace:dir:attribute-def:givenName": "Student",
        "urn:oid:2.5.4.42": "Student",
        "urn:mace:dir:attribute-def:mail": "student1@diy.myproviderconext.nl",
        "urn:oid:2.5.4.4": "One",
        "urn:mace:terena.org:attribute-def:schacHomeOrganization": "diy.myproviderconext.nl"
    }
}

最后,這是我在用戶創建觸發器上的 BE。 當在 Firebase auth 中創建新用戶時,它會創建用戶的 DB 記錄。 我希望 map 上面顯示的一些屬性到數據庫中的用戶記錄。

export const onCreate = functions.auth
  .user()
  .onCreate((user: UserRecord, context: EventContext) => {
    const timestamp = serverTimestamp();

    const dbUser: DbUser = {
      uid: user.uid,
      name: user.displayName || '',
      firstName: user.displayName || '',
      lastName: '',
      email: user.email,
      photoURL: user.photoURL,
      emailVerified: user.emailVerified,
      createdDate: timestamp,
      lastSeen: timestamp,
      providerData: JSON.parse(JSON.stringify(user.providerData)),
      userDump: JSON.parse(JSON.stringify(user)),
      contextDump: JSON.parse(JSON.stringify(context)),
    };

    // Get additional user data from the UserCredential
    // const additionalUserInfo = getAdditionalUserInfo(user); ???

    const result = getFirestore()
      .collection(constants.dbCollections.users)
      .doc(user.uid)
      .set(dbUser);

    return result;
  });

如何在不依賴客戶端的情況下訪問我的雲 function 中的這些附加屬性?

您嘗試解決的問題在此處進行了解釋:

https://firebase.google.com/docs/auth/admin/custom-claims#node.js

您在下面描述的一些數據存儲在 auth.user 中

const dbUser: DbUser = {
  uid: user.uid,
  name: user.displayName || '',
  firstName: user.displayName || '',
  lastName: '',
  email: user.email,
  photoURL: user.photoURL,
  emailVerified: user.emailVerified,
  createdDate: timestamp,<-----------------------------------------------here
  lastSeen: timestamp,<--------------------------------------------------and here
  providerData: JSON.parse(JSON.stringify(user.providerData)),
  userDump: JSON.parse(JSON.stringify(user)),
  contextDump: JSON.parse(JSON.stringify(context)),
};

但我標記為“此處”的數據需要通過“自定義用戶聲明”創建,但它在 FireBaseAnalytics 選項卡下既不是身份驗證。 如果您堅持要從 Firebase 中檢索此數據,也不是 firestore。

But for this data :

  providerData: JSON.parse(JSON.stringify(user.providerData)),
  userDump: JSON.parse(JSON.stringify(user)),
  contextDump: JSON.parse(JSON.stringify(context)),

如果您堅持從 FireBase 獲取這些數據,您應該使用 FireStore 或 FirebaseRealTimeDatabase,因為自定義聲明的 1000 字節策略。

我希望我能很好地理解你的問題。 但我確定如果你用這個添加這些屬性

// Set admin privilege on the user corresponding to uid.

getAuth()
  .setCustomUserClaims(uid, { admin: true })
  .then(() => {
    // The new custom claims will propagate to the user's ID token the
    // next time a new one is issued.
  });

您可以使用 .auth 令牌檢索它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM