èªèšŒAPIããšãã¥ã¬ãŒãããŠãããŒã«ã«éçºãšãšã³ãããŒãšã³ãã®ãã¹ããé«éåããããšã¯å¯èœã§ããïŒ Firestoreãšãã¥ã¬ãŒã¿ãŒã䜿çšãããšãç°å¢ïŒéçºããã¹ããã¹ããŒãžã³ã°ã補åïŒããšã«ç°ãªããããžã§ã¯ããäœæããå¿ èŠã¯ãããŸããããšãã¥ã¬ãŒã¿ãŒã䜿çšããããéçºçšã®ãŠã©ããã¢ãŒãã§JSONãã¡ã€ã«ããããŒã¿ãã·ãŒããããããã¹ãŠã®ã·ãŒããå®è¡ãããã§ããŸãããã¹ãã±ãŒã¹ãªã©ããŠãŒã¶ãŒããã°ã€ã³ãã圹å²ã«åºã¥ããŠããã²ãŒã·ã§ã³ããã¢ã¯ã·ã§ã³ãå®è¡ãããšã³ãããŒãšã³ãã®ãã¹ããèšè¿°ã§ããããã«ããã«ã¯ããã¹ããŠãŒã¶ãŒãåé¢ããããã®å¥ã®ãããžã§ã¯ããäœæããããã§ãŠãŒã¶ãŒãã·ãŒãããŠã¯ãªã¢ããå¿ èŠããããŸãããã¹ãŠã®ãã¹ãã±ãŒã¹ã«å¯ŸããŠã
@vladimirdjurdjevicãããäžããŠãããŠããããšãïŒ ããã¯ç§ãã¡ãããã¹ãããšã®ãªã¹ãã«ãããŸããããšãã¥ã¬ãŒãããèªèšŒãµãŒãã¹ã®éãšãããè¡ãããã®æè¯ã®æŠç¥ã¯ãŸã 決å®ããŠããŸããã ç¹å®ã®ãã®ïŒå¿åèªèšŒãªã©ïŒã¯ãšãã¥ã¬ãŒããéåžžã«ç°¡åã§ãããä»ã®ãã®ïŒSMSèªèšŒãªã©ïŒã¯éåžžã«å°é£ã§ãã
ããããç§ãã¡ã¯ééããªããããªããèšåãããšã³ãããŒãšã³ãã®ãŠãŒã¹ã±ãŒã¹ãæå¹ã«ããããšæã£ãŠããŸãïŒ
質åïŒãšãã¥ã¬ãŒã¿ã§äœ¿çšããããã«FirebaseãŠãŒã¶ãŒãããŒã«ã«ã§ã¢ãã¯ã§ããã©ã€ãã©ãªãããã°äŸ¿å©ã ãšæããŸããïŒ äœãã®ãããªãã®ïŒ
firebase.auth().setEmulatedUser({
uid: 'abc123',
// ...
});
@samtstern setEmulatedUser()
åŒã³åºããšã functions.auth.user().onCreate()
ãšãã¥ã¬ãŒããããã¯ã©ãŠãé¢æ°ãããªã¬ãŒãããŸããïŒ ãããããªããããã¯éåžžã«äŸ¿å©ã§ãããã
@samtsternããã¯ç¢ºãã«ããã€ãã®ãã¹ãã·ããªãªã«åœ¹ç«ã¡ãŸãããããã§ãéçºã«ã¯å®éã®ã€ã³ã¹ã¿ã³ã¹ãå¿ èŠã§ãã ç§ã®èãã¯ãç°ãªãç°å¢åãã«è€æ°ã®Firebaseãããžã§ã¯ããäœæããããšãé¿ããããŒã«ã«ã§ïŒãããããªãã©ã€ã³ã§ïŒéçºã§ããããã«ããããšã§ãã å¥ã®ã¢ãããŒãã¯ããµãŒãã¹ã®ããŸããŸãªç°å¢ããµããŒãããããšã§ãã åããããžã§ã¯ãã§firestoreãšauthãªã©ã®ç°ãªãç°å¢ãäœæã§ããã°ãå€ãã®åé¡ã解決ããŸãã ç§ã¯ç°å¢ããšã«ãããžã§ã¯ããäœæã§ããããšãç¥ã£ãŠããŸãããããã¯ãå°»ã®æ¬åœã®çã¿ã§ãã ãã¹ãŠã®ç°å¢ã®æ§æãããŒã¿ã®è€è£œãªã©ãçæ³çã«ã¯ã1ã€ã®Firebaseãããžã§ã¯ããäœæã§ããããã«ãããã®ã§ãããæåãã¹ãçšã®ãããŒããŒã¿ãå¿ èŠãªå Žåã¯ãFirestoreã®ã¹ããŒãžã³ã°ç°å¢ãäœæããŠããã«ããŒã¿ãã¢ããããŒãã§ããŸãã
@noelmansourè¯ã質åã§ãïŒ ããã¯ããã»ã©é£ããããšã§ã¯ãããŸãããããããã signInAsEmulatedUser
ãšsignUpAsEmulatedUser
ãããª2ã€ã®ç°ãªãåŒã³åºããå¿
èŠã§ããã2çªç®ã®åŒã³åºãã ããé¢æ°ãããªã¬ãŒããŸãã
@vladimirdjurdjevicã¯ããã«æ©èœã®ãšãã¥ã¬ãŒã¿ãŒãæé©ã§ããããšã«å®å šã«åæããŸãã ãŠãŒã¶ãŒãããŒã«ã«ã«èšå®ããããšã§è§£æ±ºã§ããªããéçºçšã®å®éã®ã€ã³ã¹ã¿ã³ã¹ãããå¿ èŠãªãã®ã«ã€ããŠèª¬æããŠãã ããã
質åïŒãšãã¥ã¬ãŒã¿ã§äœ¿çšããããã«FirebaseãŠãŒã¶ãŒãããŒã«ã«ã§ã¢ãã¯ã§ããã©ã€ãã©ãªãããã°äŸ¿å©ã ãšæããŸããïŒ
æ¬åœã«äŸ¿å©ã§ããããã¯å€§ãã«åœ¹ç«ã¡ãŸãã
çŸåšãããŒã«ã«ã§äœãããã¹ãããå¿
èŠããããã³ã«ãã°ã«èšé²ããããŠãŒã¶ãŒãæ€èšŒããã«ãŒã«é¢æ°ãtrue
èšå®ããŠããŸããããã¯ããªãå®å
šã§ã¯ãããŸããããçŸåšã®ãŠãŒã¶ãŒããšãã¥ã¬ãŒãããã«å®è¡ã§ããç°¡åãªããšã§ãã
ã¯ããããã¯ä¿¡ããããªãã»ã©äŸ¿å©ã§ã
functions.auth.user().onCreate()
ãŠããããã¹ããããããšæããŸãã çŸæç¹ã§ã®æåã®åé¿çã¯ãåºæ¬çã«onCreate
æž¡ãããã³ãŒã«ããã¯é¢æ°ããšã¯ã¹ããŒãããããã«åœã®user
ãªããžã§ã¯ããæäŸããããšã ãšæããŸãã
ãã®çš®ã®ãŠããããã¹ãã«ã€ããŠã¯ãfirebase-functions-testã確èªããŠãã ãã
ã©ã€ãã©ãªãã¢ãã¯ããŒã¿ã䜿çšããŠé¢æ°ãã³ãã©ãŒãåŒã³åºãã®ã«åœ¹ç«ã¡ãŸãã
æ¥ã2019幎10æ13æ¥ã«ã¯ã5:44ãããšã«K.ã®[email protected]ã¯æžããŸããïŒ
ãŸããfunctions.auth.userïŒïŒãonCreateïŒïŒãåäœãã¹ãããããšæããŸãã ç§
ä»ã®ãšãããæåã®åé¿çã¯åºæ¬çã«ãšã¯ã¹ããŒãã³ãŒã«ããã¯ã§ãããšä»®å®ããŸã
onCreateã«æž¡ãããé¢æ°ã¯ãåœã®ãŠãŒã¶ãŒãªããžã§ã¯ããæäŸããŸããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/firebase/firebase-tools/issues/1677?email_source=notifications&email_token=ACATB2QYJLX2LNVDTWJV25TQOMJ4VA5CNFSM4I27PTFKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKT
ãŸãã¯è³Œèªã解é€ãã
https://github.com/notifications/unsubscribe-auth/ACATB2SO3IR6UB73F4EMZPTQOMJ4VANCNFSM4I27PTFA
ã
@samtsternããã¯å®éã«Firestoreãšãã¥ã¬ãŒã¿ãŒãšäžç·ã«æ©èœããŸããïŒ ããã«åºã¥ããŠãç§ã¯ãããå¥ã®ç®çã®ããã§ãããšããå°è±¡ãåããŸããã
https://firebase.google.com/docs/functions/unit-testing#initializing
ç§ã¯ç¢ºãã«ãŠããããã¹ãã®ããã®ãªã³ã©ã€ã³ã¢ãŒããæãã§ããŸãããããã¯ã¹ããŒããŒã¯ã§ãããã ãŸãããã¹ã¿ããã§Firestoreãšãã¥ã¬ãŒã¿ã«ã¢ã¯ã»ã¹ã§ãããã©ãããããããŸããã
@FredyCãããã®ããã¥ã¡ã³ããææããŠããããŸãã ãã¢ãŒããã¯æå¹ã«ã§ããã¹ã€ããã§ã¯ãªããå®è¡ã§ããæŠç¥ã説æããŠããã ããªã®ã§ã䜿çšãããŠããèšèã¯çŽãããããã®ã§ãã
åäœãã¹ããšäžç·ã«Firestoreãšãã¥ã¬ãŒã¿ãŒãèµ·åããå Žåãã³ãŒãã¯ç¢ºå®ã«ããã«æ¥ç¶ã§ããŸãã FIRESTORE_EMULATOR_HOST
ç°å¢å€æ°ãèšå®ãããšãFirebase Admin SDKãèªåçã«Firestoreãšãã¥ã¬ãŒã¿ãŒã«æ¥ç¶ããŸãïŒ firebase emulators:exec
ããããè¡ããŸãïŒã
@samtsternãŸã ãããã®æ¥ç¶ã«åé¡ããããŸããã functions.auth.user().onCreate()
ãã¹ãã«ã©ã®ããã«åœ¹ç«ã¡ãŸããïŒ é¢æ°ã補åçã§ã¯ãªããšãã¥ã¬ãŒã¿ãŒã«æ¥ç¶ããã®ã¯çŽ æŽãããããšã§ãããããã¯Firestoreã ãã§ãããïŒ ãã¹ããããŠãŒã¶ãŒäœæãåŒã³åºããŠãå®éã«æ©èœã³ãŒããéå§ããã«ã¯ã©ãããã°ããã§ããïŒ
åè¿°ã®firebase-functions-testã«ã¯äžå¯è§£ãªã¡ãœããmakeUserRecord
ãããããã§ããããããã©ã®ããã«æ©èœããã®ããå®éã«ã©ã®ããã«äœ¿çšããã®ãã¯ããŸãæå³ããããŸããã
@firebase/testing
ããã±ãŒãžããauth.createUserWithEmailAndPassword()
ãåŒã³åºãããšããŸããããç¡å¹ãªAPIããŒã«ã€ããŠäžå¹³ãèšã£ãŠããã®ã§ããªã³ã©ã€ã³ããŒãžã§ã³ã§ã®ã¿æ©èœãããšæããŸãã
ããªããèšåãããã®envå€æ°ãçµç¹ã§
https://github.com/firebase/functions-samplesãé²èŠ§ããŠã
ãããç解ããŠããã ããŸããïŒ :)
ã¯ã©ãŠãé¢æ°ã³ãŒããadmin.auth().getUserByEmail()
åŒã³åºãã䜿çšããŠããããã1ã€ã®ã±ãŒã¹ããããŸãã é©ããããšã«ãããã¯ãšã©ãŒã§çµãããªããããããè¿ãããšãã§ããããã«ãã®ãŠãŒã¶ãŒãã©ã®ããã«äœæããã®ãç§ã«ã¯ããããªãã ãã¡ããã管çã¢ãžã¥ãŒã«å
šäœãã¢ãã¯ã¢ãŠãããããšãé€ããŠãããã¯ã¯ã¬ã€ãžãŒã§ã:)
@samtsterné ããŠãã¿ãŸããã ç§ãå®éã®ã€ã³ã¹ã¿ã³ã¹ãšèšããšããç§ã¯å®éã®ã€ã³ã¹ã¿ã³ã¹ãæå³ããŸãïŒDçæ³çã«ã¯ãéçºã®ããã«è§åºŠç°å¢ãã¡ã€ã«ã®æ§æã亀æããã¢ããªãå®éã®APIãšéä¿¡ããŠããããã«èªèšŒæ©èœãå®è£ ãç¶ãããã®ã§ãããå®éã«ã¯ãšãã¥ã¬ãŒã¿ãŒãå®è¡ãããŠããŸããã·ã³ããããŠç§ã¯ããããªãã©ã€ã³ã§è¡ãããšãã§ããŸãã ããã§ãããšãã°SMSã®éä¿¡ã«é¢ãã課é¡ãç解ã§ããŸããã ãšãã¥ã¬ãŒã¿ãŒãå®éã®SMSãç§ã®é»è©±ã«éä¿¡ããããšãæåŸ ããã®ã¯ã°ãããŠããŸãããã³ã³ãœãŒã«ïŒéä¿¡ãããSMSã®ã³ã³ãã³ãïŒã«å°å·ããããšãã§ããŸãã ããã§ã®äŸ¡å€ãããããããé¢åã§ãã ãã®ããããããžã§ã¯ãããšã«è€æ°ã®ç°å¢ããµããŒãããã ãã§ãäœæ¥ãå€§å¹ ã«æ¹åããããšæããŸãã ç°ãªãç°å¢ã®è€æ°ã®ãããžã§ã¯ãéã§æ§æãè€è£œããã«ã¯ãããªãã®æéãããããŸãã ãŸããã¹ã¯ãªããã®è€æ°ã®ãµãŒãã¹ã¢ã«ãŠã³ãã管çããŠãããŸããŸãªFirestoreãããžã§ã¯ãã«ããŒã¿ãã·ãŒãã§ããããã«ããã®ã¯é¢åã§ãã ãã®ãããFirebaseãã©ãããã©ãŒã å šäœããšãã¥ã¬ãŒãããã°ãããããã¹ãŠã®éæ¬çªç°å¢ã«äœ¿çšããŠãå®éã®Firebaseãããžã§ã¯ãã1ã€ã ã管çã§ããããšãæããŸããã ãããããããžã§ã¯ãããšã«è€æ°ã®ç°å¢ããµããŒãããã ãã§ã蚱容ã§ããçµæãåŸãããããè¯ããœãªã¥ãŒã·ã§ã³ã«ãªããããããŸããã
@FredyCãã£ãŒãããã¯ããããšã
setEmulatedUser
ãããªãã®ã解決ãããã®ã§ãã ããã«ããããšãã¥ã¬ãŒã¿ãŒãåãå
¥ããåœã®èªèšŒããŒã¯ã³ãããŒã«ã«ã«æã€ããšãã§ããŸãããprodã«ãã£ãŠæåŠãããŸãã ããå€ãã®å®å
šæ§ãããå€ãã®éé¢ãªã©ã.onCreate
é¢æ°ãæ£ããããªã¬ãŒãããããã«ããã®ãšãã¥ã¬ãŒã¿ãŒãšé¢æ°ãšãã¥ã¬ãŒã¿ãŒãçµ±åããŸããadmin.auth()
ãAuthãšãã¥ã¬ãŒã¿ãŒãæãããã«ãªããŸããæããã«ïŒ2ïŒã¯æ£ãã話ã ãšæããŸãããå®è£ ãšä¿å®ãå€§å¹ ã«ç°¡åã§ãããããïŒ1ïŒã«æºè¶³ãã人ã®æ°ãææ¡ããããšããŠããŸããã
@samtsternãªãã»ã©ã ç§ãééã£ãŠããå Žåã¯ç§ãèšæ£ããŠãã ããããããïŒ1ïŒã¯ãã§ã«è§£æ±ºãããŠããŸãããïŒ ã€ãŸãããã¹ãã§ã¯æ¬¡ã®ããã«åŒã³åºãããšãã§ããFirestoreãšãã¥ã¬ãŒã¿ãŒã¯ç§ããã®ãŠãŒã¶ãŒãšããŠèªèãããããã»ãã¥ãªãã£ã«ãŒã«ã«å¯ŸããŠãã¹ãã§ããŸãã ç§ã¯ãŸã å®éã«ãããè©ŠããŠããŸãããããããŸã§ã®ãšããææã«èŠããŸã:)
const app = firebase.initializeTestApp({
projectId,
auth: {
uid: 'owner'
}
})
ïŒ2ïŒã¯ç¢ºãã«éåžžã«äŸ¿å©ã«èãããŸããã確å®ã«åãçµãã«ã¯ã¯ããã«è€éã§ãã æ®å¿µãªããã補åå šäœã«å¯Ÿããç§ã®æŽå¯ã¯éåžžã«éãããŠãããããããã§åœ¹ç«ã€ã¢ã€ãã¢ãæäŸããããšã¯ã§ããŸããã
å°ããã€æ§ç¯ããå¿ èŠããããšæããŸãã ãã¹ãŠã®ã·ããªãªãäžåºŠã«ã«ããŒããããšããã®ã§ã¯ãªããæ¢ç¥ã®ãŠãŒã¹ã±ãŒã¹ã«åºã¥ããŠæ§ç¯ããå€åºå ã§è¿œå ããŸãã ç§ã®éãããæèŠã§ã¯ãé¢æ°ããªã¬ãŒãšãšãã«ããŠãŒã¶ãŒããŒã¿ããŒã¹ãããšãã¥ã¬ãŒãããããšã¯ããã»ã©é£ããããšã§ã¯ãªãããã§ãã
@FredyCããªãã¯æ£ããã§ãïŒ1ïŒã¯ãã¹ãã¹ã€ãŒãå
ã§äœ¿çšããããã«è§£æ±ºãããŠããŸãã ãã ãããã1ã€ã®äœ¿çšäŸã¯ãAndroid / iOS / Webã¢ããªãããŒã«ã«éçºçšã®ãšãã¥ã¬ãŒã¿ãŒã«çŽæ¥æ¥ç¶ããããšã§ãã ãã®å Žåã @firebase/testing
ã¯äœ¿çšã§ããŸããã
åãããŸããã æ£çŽãªãšããã @firebase/testing
ãåå¥ã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãªããã¯ãã¹ãã©ãããã©ãŒã ã§äœ¿çšã§ããã°ãããã¯ã¡ãã£ãšçŽ æŽãããããšã§ãã éä¿¡ããšãã¥ã¬ãŒã¿ãŒã«ãªãã€ã¬ã¯ãããã®ã¯ã©ãã»ã©é£ããã®ã§ããããïŒ ãŸãã«ãã®ããã®FIRESTORE_EMULATOR_HOST
ã§ã¯ãããŸãããïŒ ãšãã¥ã¬ãŒã¿ãä»ã®ãµãŒãã¹ãæã€å Žåã¯ã FIREBASE_EMULATOR_HOST
ãããªãã®ãããé©åã ãšæããŸããã
@vladimirdjurdjevicç§ãèããŠããã®ã¯ãå®éã«ã¯signInWithPhone
ã¡ãœãããã¢ãã¯ã¢ãŠãããŠããã®åäœãå¶åŸ¡ã§ããããã«ããããšã§ã¯ãªãã§ããããã ããããã°ããšãã¥ã¬ãŒã¿ãŒãã³ã³ãœãŒã«ã§ã·ãã¥ã¬ãŒããããSMSã³ãŒããååŸããããšã«ã€ããŠå¿é
ããå¿
èŠã¯ãããŸãã:)
ãã¡ãããFirestoreã®ãšãã¥ã¬ãŒã¿ãŒã«å¯ŸããŠèªèšŒããïŒãããŠããã«æ¥ç¶ããïŒæ¹æ³ãå¿ èŠã§ãã 以åã®https://github.com/firebase/firebase-tools/issues/1677#issuecomment-542897671ã§æŠèª¬ãããããªãã®ã ä¿è·ãããŠããªãããŒã¯ã³ãçæããããã®åºæ¬çãªæ¹æ³ããããŸãïŒ //github.com/firebase/firebase-js-sdk/blob/master/packages/testing/src/api/index.ts#L64ã ãããããŸããããã©ããã¯ããããŸããã
ãã¡ããããµãŒãããŒãã£ã®ã©ã€ãã©ãªãã¢ãã¯ããããšã¯å¿ ãããç°¡åã§ã¯ãããŸããããäžåºŠç解ããã°ãçŽ æŽãããçµæãããããããšãã§ããŸãã æçµçã«ã¯ãäžè¬çã«ç°¡åã«ããããã«ãããã€ãã®ã©ã€ãã©ãªã«æœåºãããå¯èœæ§ããããŸãã
ãŸãããããã®signInã¡ãœããã¯ãéåžžã«å€ãã®ãšã©ãŒã³ãŒããã¹ããŒããå¯èœæ§ããããšèããŠããŸããããã¯ãé©åãªãã¹ãã§ã察åŠããå¿ èŠããããŸãã ããã¯ãã¢ãã¯ã§ãç°¡åã«å®è¡ã§ããŸãã
@samtstern firebase.auth()
åå空éã³ã³ããã¹ããsetEmulatedUser
ãããªãããã¯ã§æ¡åŒµããããšã¯ãæ¢åã®ãšãã¥ã¬ãŒã·ã§ã³æŠç¥ã®ã¢ã³ããã¿ãŒã³ã®ããã«èŠããŸãã ãã®æšå¥šäºé
ã¯ãããã±ãŒãžåŽã®æ¡åŒµã®ããããã«åœ±é¿ãããŠããã®ã§ããããã
ä»ã®ãšãã¥ã¬ãŒã¿ãŒãšåæ§ã«ãHTTPãä»ããŠå¥ã®èªèšŒãµãŒãã¹å±€ãèµ·åãããã¯ã©ã€ã¢ã³ãåŽã®æ§æã§æ¢åã®APIãµãŒãã§ã¹ããªãã€ã¬ã¯ãããŠå©çšã§ããããã«ãªããšæããŸãã
ãããããŠãŒã¶ãŒå/ãã¹ã¯ãŒããä»ããŠåºæ¬ãŠãŒã¶ãŒã®CRUDãæå°éã«ãµããŒãããAdminããã³ClientAPIã§ãšãã»ã³ããªãã¯ãªAuthNã±ãŒã¹ããšã©ãŒãè¿ãããã«ããããšæããŸãã ã¡ãªã¿ã«ã管çè
ã§ã®ã«ã¹ã¿ã ããŒã¯ã³ã®ãµããŒãããå§ããŠãã signInWithCustomToken
ã¯éåžžã«å¹æçã ãšæããŸãã ãã¶ããããã¥ã¡ã³ãã§å
¬éãããŠããAPIãµããŒããããªãã¯ã¹ã䜿çšããŠãã¶ãäžãã£ãŠããæç©ãå®è£
ããŸãã
@FredyCãã€ã³ãã«ãšã£ãŠãçµ±åèªèšŒãã¹ãã®çŸåšã®æŠç¥ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®@firebase/testing
ãæ¡ä»¶ä»ãã§ã€ã³ããŒãããŠãã«ã¹ã¿ã initializeTestApp
åŒã³åºãã«ã«ãŒãã£ã³ã°ããããšã§ãã ãã®ã¢ã¯ã·ã§ã³ã¯ããããžã§ã¯ãããŒã ã®ãã«ãæã«ããã±ãŒãžã®é€å€ã匷調ããã ãã§ãªãããšãã¥ã¬ãŒã¿ãŒã®ãªãã€ã¬ã¯ãæ§æã2ã€ã®ããã±ãŒãžAPIïŒ initializeTestApp
ãšfirestore.settings
/ functions.useFunctionsEmulator
ïŒã«åæ£ããŸãã
ææãããã¯ïŒ
çµ±åèªèšŒãã¹ãã®çŸåšã®æŠç¥ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«
@firebase/testing
ãæ¡ä»¶ä»ãã§ã€ã³ããŒãããŠãã«ã¹ã¿ãinitializeTestApp
åŒã³åºãã«ã«ãŒãã£ã³ã°ããããšã§ãã
ãããšãç§ã¯ãã¹ãå
ã§ãã®ã¡ãœãããåŒã³åºããŠããŸãã ç§èš£ã¯ãéåžžã®initializeApp
é¢æ°ãã€ã³ããŒãããindex.ts
ååšããããšã§ãã ãšãã¥ã¬ãŒã¿ãŒã®èµ·åæã«åŒã³åºãããŸããããã¹ãã®å®è¡äžã¯å¥ã®ããã»ã¹ã§ãããäºãã«ç«¶åããŸããã ãããã£ãŠãæ¡ä»¶ä»ãã€ã³ããŒãã®è² æ
ã¯å®éã«ã¯ãããŸããã
ãã¡ãããããã¯ãããšãã°èªèšŒããã¹ãããå Žåãšã¯ç°ãªãå ŽåããããŸãã ãã¹ãã©ã³ããŒãããã»ã¹ãã¢ããªã³ãŒããšå
±æãããŠã§ãã¢ããªã ãã ããåäœãã¹ãã§ã¯ãéåžžãã¢ããªå
šäœããã¹ãã«ã€ã³ããŒãããããšã¯ãããŸããã initializeApp
ã¯ããã¹ãã«é¢ä¿ããªãããŸã£ããã€ã³ããŒããããŠããªãã³ãŒãã§å®è¡ãããŠããå¯èœæ§ããããŸãã
@FredyCãŠããããã¹ãã®ææžåããã䜿çšæ³ã«ã€ããŠåæããŸããã APIãçºæ£ããåçã€ã³ããŒããææžåããããããããå€ãããã«ã¢ããªã·ããªãªã«ã€ããŠå®éã«è©±ããŠããŸããã
Honestly, it would be kinda superb if @firebase/testing could be used cross-platform instead of having separate solutions
åž°å±ã衚瀺ãããã£ãã ãã§ãã ããžã¿ã«ãã€ãã¡ã€ã
@FredyCãã£ãŒãããã¯ããããšã
- å®éã«ãŠãŒã¶ãŒãäœæããã«ãFirestoreãRealtimeDatabaseãªã©ã®ãµãŒãã¹ã䜿çšããã«ã¯ãµã€ã³ã€ã³ããŠãã ããã ä»ã®ãšãããããã¯
setEmulatedUser
ãããªãã®ã解決ãããã®ã§ãã ããã«ããããšãã¥ã¬ãŒã¿ãŒãåãå ¥ããåœã®èªèšŒããŒã¯ã³ãããŒã«ã«ã«æã€ããšãã§ããŸãããprodã«ãã£ãŠæåŠãããŸãã ããå€ãã®å®å šæ§ãããå€ãã®éé¢ãªã©ã- å®éã«èªèšŒãçŽæ¥ãã¹ãããŸãã ããã«ã¯ããã€ãã®éšåããããŸãïŒ
NSã å¿ èŠãªãã¹ãŠã®APIåŒã³åºãã«å¿çããŠãAuthSDKãæå®ã§ããããã«ããèªèšŒãšãã¥ã¬ãŒã¿ãŒã
NSã.onCreate
é¢æ°ãæ£ããããªã¬ãŒãããããã«ããã®ãšãã¥ã¬ãŒã¿ãŒãšé¢æ°ãšãã¥ã¬ãŒã¿ãŒãçµ±åããŸãã
NSã é¢æ°ãšãã¥ã¬ãŒã¿ãŒå ã®èªåã¢ãã¯ã«ãããä»æ¥ã®FirestoreãRTDBã®å Žåãšåæ§ã«ãadmin.auth()
ãAuthãšãã¥ã¬ãŒã¿ãŒãæãããã«ãªããŸããæããã«ïŒ2ïŒã¯æ£ãã話ã ãšæããŸãããå®è£ ãšä¿å®ãå€§å¹ ã«ç°¡åã§ãããããïŒ1ïŒã«æºè¶³ãã人ã®æ°ãææ¡ããããšããŠããŸããã
@samtsternãŸã第äžã«ãç§ã¯â€ïžãã®çš®ã®ãšãã¥ã¬ãŒã·ã§ã³ãæã£ãŠããã§ãããã
ããããããããŸããã 1e2eãã¹ãã®äœæã«éåžžã«åœ¹ç«ã¡ãŸãã çŸåšãèªèšŒã«ã¯å®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããå¿ èŠããããŸããããã¹ãã£ã³ã°ãã«ãŒã«ããã¡ã€ã¢ã¹ãã¢ãããã³æ©èœã«ã¯ãšãã¥ã¬ãŒã¿ãŒã䜿çšã§ããŸãã
setEmulatedUserã䜿çšããŠãfirebase.initializeTestAppã§è¡ãããã®ãšåãæ¹æ³ã§ãŠãŒã¶ãŒãã¢ãã¯ããããšãå¯èœã§ãããšæããŸãã ã«ã¹ã¿ã ããŒã¯ã³ããã®ä»ã®ãŠãŒã¶ãŒé¢é£ããŒã¿ãªã©ãéä¿¡ã§ããã¯ãã§ãã
firebase.auth().signInWithCredential(credential)
䜿çšããŠã¯ã©ã€ã¢ã³ãã¢ããªã§äœ¿çšã§ãããµã³ãã«ã®ã¯ã¬ãã³ã·ã£ã«ãååŸããããšãå¯èœã§ããå¿
èŠããããŸã
ãã®åé¡ãæèµ·ããŠãããŠããããšã
ç§ãã¡ã¯3ã€ã®ããšã®ããã«å®éã®ãšãã¥ã¬ãŒã¿ãŒãèŠãããšæã£ãŠããŸãïŒ
ããªããç§ãã¡ã®ããã«äœããããã«ãªãªãŒã¹ããããšãé¡ã£ãŠããŸããããã¯ããªãã®è£œåããã䟡å€ã®ãããã®ã«ããã§ãããïŒ ãã®ãããªãµãŒãã¹ã§ã¯ãéçºè ã®çç£æ§ãéåžžã«éèŠã§ãã
ããã¯å€ãã®äººã®ãŠã£ãã·ã¥ãªã¹ãã®æ©èœã®ããã§ãã Firebase authã¯ãçŸåšã®äŸ¡æ Œèšå®ã§ãã³ããŒã¯ã³ã®IDaaSã®ããã§ãããã®ãããCloudFunctionsã䜿çšããŠããŒã«ã«ã§éçºã§ããªãã®ã¯æ¬åœã«èŠçã§ãã FBããŒã ãç§ãã¡ã®ããã«ããã«ã¢ããããŒããæã£ãŠããããšãé¡ã£ãŠããŸãïŒ ð
ç·šéïŒãã®ã¹ã¬ããã¯åé¡ã«åãããŠããããã@ firebase -opsããéä¿¡ããŸã...
ãŸãããã®ãšã©ãŒããããŸã...èªèšŒãšãã¥ã¬ãŒã¿ãååšããªããå®è¡ãããŠããªããããé¢æ°ã¯ç¡èŠãããŸãã
ããã¯ã次ã®ã³ãŒãã«ãã£ãŠããªã¬ãŒãããŸãã
é¢æ°.auth.userïŒïŒãonDeleteïŒïŒ
ããã«é¢ããæ å ±...
@dominikfoldi
ç§ã¯ããªãã®æèŠã«åæããŸãã ãã®éã«åœ¹ç«ã€ãããããªã1ã€ã®ãã³ãïŒ
ãã¡ããããã¹ãŠã®éçºè ãç¬èªã®Firebaseãããžã§ã¯ããäœæã§ããŸãããããã§ãFirebaseããã·ã¥ããŒãã§ãã¹ããŠãŒã¶ãŒã管çããå¿ èŠããããŸãããããã¯çæ³çã§ã¯ãããŸããã
auth().createUser
ãªã©ã®firebase admin SDKã䜿çšããŠãããã°ã©ã ã§ãŠãŒã¶ãŒãã·ãŒãããã³ç®¡çã§ããŸããhttpsïŒ//firebase.google.com/docs/auth/admin/manage-usersãåç
§ããŠ
ãã®ã¹ã¬ãããèªãã åŸãç§ã¯ããã®äººã ããã¡ãŠã³ããªã圹ã«ç«ã€ãšæããããããªããšæããŸãã
ç§ã¯Foundryã®å ±ååµèšè ã®1人ã§ãã Foundryã¯ãFirebase Cloud FunctionsãååŸããã³ãŒããçŽæ¥å®è¡ããéçºç°å¢ãšããŠæ©èœãããµãŒããŒäžã«æ¬çªFirebaseã¢ããªã®ã³ããŒãäœæããCLIããŒã«ã§ãã æ§æã¯å¿ èŠãããŸããã
Foundryã¯ãœãŒã¹ã³ãŒããã¡ã€ã«ãç£èŠããã³ãŒããããŒã«ã«ã«ä¿åãããã³ã«ãµãŒããŒäžã§å®è¡ãããããæ°ç§ã§çµæãè¿ããŸãã ãã¹ãŠãè¶
é«éã§ãã
éçºäžã«å©çšã§ããããã«ãYAMLãã¡ã€ã«ãä»ããŠæ¬çªã¢ããªããã³ããŒããFirestoreãRealtimeDBãããã³AuthUsersããŒã¿ãæå®ããŸãã
users:
- getFromProd: 5 # Copy first 5 users from your Firebase project
- getFromProd: ['id-1', 'id-2'] # Copy users with the specified IDs from your Firebase project
# Copy first 3 documents from production from the collection 'userWorkspaces'
# also add a custom document with id 'new-user-workspace' with a new data
# format that you want to use
firestore:
- collection: userWorkspaces
docs:
- getFromProd: 3
- id: new-user-workspace
data: {"newDataFormat": 42}
ãŸããã³ãŒããå®è¡ãããšãã«ã¯ã©ãŠãé¢æ°ãããªã¬ãŒããæ¹æ³ãæå®ããŸãã ã¯ã©ãŠãæ©èœã®REPLã®ããã«æ©èœããŸãã ããããããšã§ãã¯ã©ãŠãæ©èœãæ¬çªããŒã¿ã§æ£ããæ©èœãããããã€ããåŸã¯æ¬çªç°å¢ã§æ£ããæ©èœããããšãåžžã«ç¢ºèªã§ããŸãã
ãŸããã¯ã©ãŠãæ©èœã¯å±éãããŠãããã®ããã«æ©èœããŸãã
ãããã®éçºç°å¢ã¯ãã»ãã·ã§ã³ãéå§ãããšã¢ãããã¯ã«äœæãããŸãã ãã®ãããããŒã ã®å šå¡ãèªåã®ç°å¢ã§æäœããããã§æ··ä¹±ããå¯èœæ§ããããŸãã
ããã§ã®ãã£ã¹ã«ãã·ã§ã³ãã¹ãã ããããªãã®ã§ã質åãããã°é æ
®ãªãã¡ãŒã«ã§éã£ãŠãã ãã
ãããžã§ã¯ãã§Foundryãã»ããã¢ãããããæäŒãããããŠããã ããã¡ãŒã«ããéããã ããã
ããã§ããããªãããããã©ã®ããã«èª¬æããç§ãããŒã ããŒãžã§èªãã ãããããã®ãµãŒãã¹ã¯ã¯ã©ãŠãããŒã¹ã§ãã
代ããã«ãFirebaseãšãã¥ã¬ãŒã¿ã¯ãªãã©ã€ã³ã§ãæ©èœãããããèªåãã¹ãã«åœ¹ç«ã¡ãŸãã
@samtsternãã®åé¡/æ©èœã®é²æç¶æ³ãŸãã¯å¥ã®è§£æ±ºçã¯ãããŸããïŒ ããŒã«ã«ã§æåãã¹ããå®è¡ã§ããããã«ãã¯ã©ãŠãFirestoreãšãã¥ã¬ãŒã¿ãŒãšé£æºããããã«ïŒ1ïŒsetEmulatedUserãå¿ èŠã§ãã ãã1ã€ã®ãªãã·ã§ã³ã¯ããšãã¥ã¬ãŒã¿ãŒã®èµ·åæã«ãŠãŒã¶ãŒIDãèšå®ããã³ãã³ãã©ã€ã³åŒæ°ã䜿çšããããšã§ãã ãã®ããã«ããŠããšãã¥ã¬ãŒã¿ãŒã¯èµ·åæã«æž¡ããããŠãŒã¶ãŒIDã§å®è¡ãããŸãã ãã®ããã«ããŠãã«ãŒã«ãããŒã«ã«ã§ãã¹ãã§ããŸãã
ããªãã®ã³ã¡ã³ãã«ãããšïŒ2019幎10æ17æ¥
_æããã«ïŒ2ïŒã¯æ£ãã話ã ãšæããŸãããå®è£
ãšä¿å®ã倧å¹
ã«ç°¡åã§ãããããïŒ1ïŒã«æºè¶³ãã人ã®æ°ãææ¡ããããšããŠããŸããã
ïŒ1ïŒå®éã«ãŠãŒã¶ãŒãäœæããã«ãFirestoreãRealtimeDatabaseãªã©ã®ãµãŒãã¹ã䜿çšããã«ã¯ãµã€ã³ã€ã³ããŸãã ä»ã®ãšãããããã¯setEmulatedUserã®ãããªãã®ã解決ãããã®ã§ãã ããã«ããããšãã¥ã¬ãŒã¿ãŒãåãå ¥ããåœã®èªèšŒããŒã¯ã³ãããŒã«ã«ã«æã€ããšãã§ããŸãããprodã«ãã£ãŠæåŠãããŸãã ããå€ãã®å®å šæ§ãããå€ãã®éé¢ãªã©_
ç§ãã¡ã¯å®å
šãªèªèšŒãšãã¥ã¬ãŒã¿ãŒã«åãçµãã§ããŸãã
ã¿ããªã欲ããã çŸåšæäŸã§ããã¿ã€ã ã©ã€ã³ã¯ãããŸããããåªå
床ãé«ãã§ã
ç§ãã¡ã®ããã«ã
8:12 ChuckBã®ã§éã2020幎5æ22æ¥ã«[email protected]æžããŸããïŒ
@samtsternhttps ïŒ//github.com/samtsterné²æç¶æ³ãŸãã¯ãã®ä»
ãã®åé¡/æ©èœã®è§£æ±ºçã¯ïŒ ïŒ1ïŒsetEmulatedUserãæäœããå¿ èŠããããŸã
ããŒã«ã«ã§æåãã¹ããå®è¡ã§ããããã«ãã¯ã©ãŠãFirestoreãšãã¥ã¬ãŒã¿ãŒãããªãã®ã³ã¡ã³ãã«ãããšïŒ2019幎10æ17æ¥
_æããã«ïŒ2ïŒã¯æ£ãã話ã ãšæããŸãããç§ã¯æèŠãåŸãããšããŠããŸãã
ïŒ1ïŒã¯ããªãç°¡åãªã®ã§ãäœäººã®äººãæºè¶³ããã§ãããã
å®è£ ããã³ä¿å®ãïŒ1ïŒãµã€ã³ã€ã³ããŠFirestoreãRealtimeDatabaseãªã©ã®ãµãŒãã¹ã䜿çšããã«äœ¿çšãã
å®éã«å®éã®ãŠãŒã¶ãŒãäœæããŸãã ä»ã¯ãããããã®ã§ã
setEmulatedUserã解決ããŸãã ããã¯ããªããåœã®èªèšŒãæã€ããšãå¯èœã«ããã§ããã
ãšãã¥ã¬ãŒã¿ãåãå ¥ããããŒã«ã«ããŒã¯ã³ã§ãããã«ãã£ãŠæåŠãããŸã
補åã ããå€ãã®å®å šæ§ãããå€ãã®éé¢ãªã©_â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-632660684 ã
ãŸãã¯è³Œèªã解é€ãã
https://github.com/notifications/unsubscribe-auth/ACATB2Q4LV7NXMQFEALNPXLRSZT25ANCNFSM4I27PTFA
ã
1.å®éã«ãŠãŒã¶ãŒãäœæããã«ãFirestoreãRealtimeDatabaseãªã©ã®ãµãŒãã¹ã䜿çšããã«ã¯ãµã€ã³ã€ã³ããŸãã ä»ã®ãšãããããã¯setEmulatedUserã®ãããªãã®ã解決ãããã®ã§ãã ããã«ããããšãã¥ã¬ãŒã¿ãŒãåãå ¥ããåœã®èªèšŒããŒã¯ã³ãããŒã«ã«ã«æã€ããšãã§ããŸãããprodã«ãã£ãŠæåŠãããŸãã ããå€ãã®å®å šæ§ãããå€ãã®éé¢ãªã©ã
æ«å®çã«ãããã§ãã³ããŒã¯ã³ã«æºè¶³ããŸã
https://stackoverflow.com/questions/62736060/firebase-test-auth-cloud-functions-locally
ããã¯ãŸã äžå¯èœã§ããïŒ
@ rishisingh-devçŸåšãfirebaseãšãã¥ã¬ãŒã¿ãŒã«ã¯èªèšŒãšãã¥ã¬ãŒã¿ãŒãä»å±ããŠããªããããèªèšŒãšãã¥ã¬ãŒã¿ãŒãå®è¡ããããšã¯ã§ããŸããã
ãã ããèªèšŒãå«ãã¯ã©ãŠãæ©èœããã¹ãããããšã¯å®å šã«å¯èœã§ãã ããã€ãã®èªèšŒAPIãå¿ èŠãšããé¢æ°ããªãã¡ã¯ã¿ãªã³ã°ãããã¹ãã§ã¢ãã¯ãããšåæã«ãfirebaseé¢æ°ãã¡ã€ã«ã§å®éã®é¢æ°ãæäŸã§ããŸãã ãã¹ãèšå®ã®å¿ å®åºŠã¯äœããªããŸãããçš®é¡ã®åé¡ã§ã¯ãªããçšåºŠã®åé¡ã«ãªããŸããèªèšŒåŒã³åºããçŽæ¥ãã¹ãããŠããã ãã§ãããæåŸ ã©ããã®çµæããã¹ãã§ããŸãã
ãã®SOã®è³ªåã§ã¯ã次ã®ããã«ãªããŸãã
function sendWelcomeEmail(user) {
console.log(user.uid);
console.log(user.email);
console.log(user.displayName);
}
exports.sendWelcomeEmail = functions.auth.user().onCreate((user) => sendWelcomeEmail(user));
ãŸãããã¹ãã§ã¯ã sendWelcomeEmail
çŽæ¥åŒã³åºããŠãå¿
èŠãªåŠçãå®è¡ãããããšã確èªããŸãã
addFriend
ãšåŒã°ããããè€éãªã¯ã©ãŠãé¢æ°ãããããŠãŒã¶ãŒãåéã®é»åã¡ãŒã«ãå
¥åããuidãå¿
èŠã ãšããŸãã ããã¯ãauths getUserByEmail
ãä»ããŠååŸã§ããŸãã
function addFriend(email, getUserByEmail ) {
const friendUid = getUserByEmail(email);
// do things with friendUid;
}
exports.addFriend = functions.https.onCall(async (data, context) => {
const email = data.email;
const getUserByEmail = (email) => admin.auth().getUserByEmail(email);
return { res: await addFriend(email, getUserByEmail ) };
}
ã¯ã©ãŠãã®fn宣èšã§ã¯ãå®éã®getUserByEmail
ãéä¿¡ããŸããããã¹ãã§ã¯ã代ããã«åœã®å®£èšãéä¿¡ããŸãã
async function testAddFriend() {
const emails = {"[email protected]": "test-uid")
const fakeGetUserByEmail = (email) => emails[email];
addFriend("[email protected]);
// verify the things were done with friendUid
}
ããã¯ãåäœãã¹ãã§ãµãŒãããŒãã£ã®APIããã¹ãããããšãšå€§ããç°ãªããšã¯æããŸããã Firebaseãšãã¥ã¬ãŒã¿ãŒã«èªèšŒãæäŸããããšããã€ã©ãŒãã¬ãŒããããšã³ãããŒãšã³ãã®ãã¹ãã·ããªãªãåé€ãããŸããããã¹ãéã§æ°žç¶çãªç¶æ ãç¶æããããªããããåäœãã¹ããå€§å¹ ã«å€æŽãããããšã¯ãããŸããã
確èªã®ããã«ã¯ã©ãŠãã«ã¢ããããŒãããªããŠãããããããŒã«ã«ã§å®è¡ã§ããããã«ããããšæããŸã
export const onCreate = functions.auth.user().onCreate((user) => {
addGravatarURLtoUserData(user.uid, user.email)
})
export const addGravatarURLtoUserData = async (uid, email) => {
const hash = crypto.createHash("md5").update(email).digest("hex")
await admin.database().ref(`users/${uid}`).update({ gravatarURL: uid })
}
ã¡ãªã¿ã«ãonCreateé¢æ°å ã§user.displayNameãååŸã§ããŸããïŒ
ã¯ããèšå®ãããŠãããšæããŸããããã£ãŠã¿ãŸãããïŒ
ã¯ããnullãè¿ããŸãã
ç§ã¯ïŒããŒã«ã«ã§ã¯ãªãïŒã¯ã©ãŠãã§ãããè©ŠããŸããã
ç§ã®ã³ãŒãã¯ããã«ãããŸãã
exports.sendWelcomeEmail = functions.auth.user().onCreate((user) => {
console.log(user.uid);
console.log(user.email);
console.log(user.displayName);
});
èå³æ·±ãããšã«ãç§ã¯è¡šç€ºåã䜿çšããŠããŸãããã«ã¹ã¿ã ãŠãŒã¶ãŒã®displayNameã䜿çšããŠããŸãã
ãªã¢ã«ã¿ã€ã ããŒã¿ããŒã¹
/**
* updates Custom data in the realtime datastore users object, except for the username
* <strong i="7">@param</strong> data
* <strong i="8">@returns</strong> {Promise<void>}
*/
export async function updatePersonalData(data) {
const { displayName } = data
try {
await firebase
.database()
.ref("users/" + firebase.auth().currentUser.uid)
.update({
displayName: displayName,
})
userDataStore.update((user) => {
return { ...user, displayName: displayName }
})
} catch (e) {
alert(e.message)
}
}
10æ44åã«2020幎7æãéã10ã«ã¯ãrishisingh-devã®[email protected]
æžããŸããïŒ
ã¯ããnullãè¿ããŸãã
ç§ã¯ïŒããŒã«ã«ã§ã¯ãªãïŒã¯ã©ãŠãã§ãããè©ŠããŸããã[ç»åïŒã¹ã¯ãªãŒã³ã·ã§ãã2020-07-10 at 2 43 12 AM]
https://user-images.githubusercontent.com/56976320/87140958-29f3ac80-c257-11ea-98d3-084fad619de7.pngç§ã®ã³ãŒãã¯ããã«ãããŸãã
console.logïŒuser.uidïŒ;
console.logïŒuser.emailïŒ;
console.logïŒuser.displayNameïŒ;
}ïŒ; `` `â
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-656587759 ã
ãŸãã¯è³Œèªã解é€ãã
https://github.com/notifications/unsubscribe-auth/AABU35Q27EMMHYAYU5CNZR3R23PIDANCNFSM4I27PTFA
ã>>
æ¬å ·
Nikos Katsikanis
ã¯ããç§ã®äž»ãªç®æšã¯ã onCreate
é¢æ°å
ã®ãŠãŒã¶ãŒæ
å ±ã§ããŒã¿ããŒã¹ãæŽæ°ããããš
ãããã displayName
ååŸã§ããªãããã onCallable
é¢æ°ãäœæããŠå®è¡ããŸããã
ããããšãã
@samtsternããã«åãçµãã§ããã®ãèŠãŠãšãŠãããããã§ãïŒïŒ
ãã1ã€ã®åªããç¹ã¯ãã»ãã¥ãªãã£ãªãã§Chromeãéãå¿ èŠããªãããšã§ãã
@samtstern
2ãæåŸã倧ãŸããªèŠç©ãããåºãããšã¯å¯èœã§ããïŒ
æ¥å¹Žåãã«çºéããããšæããŸãã å®éã®ãããžã§ã¯ãã«å¯ŸããŠçµ±åãã¹ããæžãå§ããã®ãããããšãèªèšŒãšãã¥ã¬ãŒã¿ãŒãæ°ãæåŸ ã€ã®ããšãã決å®ã«çŽé¢ããŠããŸãã ããã§å°ãæäŒã£ãŠããããŸããïŒ
äžçªã
ãã¯ã©ã¹
Firebaseã®ããªã·ãŒã§ã¯ã100ïŒ ç¢ºä¿¡ãæãŠãªãéããäœãããã€ãªãªãŒã¹ãããããèŠç©ããããšã¯ãããŸããã çŸåšãAuthãšãã¥ã¬ãŒã¿ãŒã«åãçµãã§ããŸããããªãªãŒã¹æ¥ãéžæããã®ã«ååãªæºåãã§ããŠããŸããã
ããã¯ç§ãã¡ã®æåªå äºé ã®1ã€ã§ãããã¢ããªã®ãã¹ããéå§ãããã®ãåŸ ã€ã¹ãã§ã¯ãªããšæããŸãã ä»æ¥prodã«å¯Ÿãããã¹ããäœæããå©çšå¯èœã«ãªã£ããšãã«ãšãã¥ã¬ãŒã¿ãŒãã¿ãŒã²ããã«ããããã«åãæ¿ããŸãã
äºè§£ããŸããã@ samtsternã«æè¬ããŸãã ããã¯åœ¹ã«ç«ã¡ãŸãïŒ
èªèšŒãšãã¥ã¬ãŒã¿ãŒãæ¬åœã«äœ¿çšãããã®ã¯ããŠãŒã¶ãŒããŒã¯ã³ã®ã«ã¹ã¿ã ã¯ã¬ãŒã ãå«ãã¯ã©ãŠãé¢æ°ãšFirestoreãªã¯ãšã¹ãããã¹ãããããšã§ãã Firebase Consoleã®ã«ãŒã«ãã¬ã€ã°ã©ãŠã³ãã§Firestoreã䜿çšããŠã«ã¹ã¿ã ã¯ã¬ãŒã ããã¹ãããããšã¯ã§ããŸãããæ¬æ ŒçãªèªèšŒãšãã¥ã¬ãŒã¿ãŒã䜿çšãããšãçè«çã«ã¯ããŠãŒã¶ãŒããŒã¯ã³ã«é¢ããŠãã¹ãã®æ¹æ³ã§ããã«å€ãã®ããšãã§ããããã«ãªããŸãã
æ確ã«ããããã«ãç§ãã¡ã¯å®éã®ãµãŒãã¹ãšã³ããã€ã³ãããšãã¥ã¬ãŒãããæ¬æ ŒçãªèªèšŒãšãã¥ã¬ãŒã¿ãŒã«åãçµãã§ããŸãïŒå¯èœãªéãïŒã 以åã®ã³ã¡ã³ãã瀺åãããããªè»œéãªãã®ã¯ããæ€èšããŠããŸããã
@samtsternãèãã®ã¯çŽ æŽãããããšã§ãïŒã«ã¹ã¿ã ã¯ã¬ãŒã ãšãšãã«ããµãŒãããŒãã£ã®çµ±åã§ãã䜿çšãããããïŒã é²æç¶æ³/ ETAã«ã€ããŠããããšãã§ããå Žæã¯ãããŸããïŒ
@fandyç³ãèš³ãããŸãããããŸã å ±æã§ãããã®ã¯ãããŸãã...
ãµã ã«æè¬ããŸããçŸåšããã¹ãŠã®ãã¹ããæåã§è¡ã£ãŠããŸãã
èªèšŒã¢ãã¯ãªãã§e2eãã¹ããäœæããããã«åªåãã䟡å€ããããŸã
14æ32åã®æ°Žã2020幎8æ26æ¥ã«ã¯ããµã ã»ã¹ã¿ãŒã³ã®[email protected]ã¯æžããŸããïŒ
>>
>>
@fandy https://github.com/fandyç³ãèš³ãããŸããããäœããããŸãã
ãŸã å ±æããŠããŸã...â
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-680850282 ã
ãŸãã¯è³Œèªã解é€ãã
https://github.com/notifications/unsubscribe-auth/AABU35UAQDBYEXKKINJSM43SCT6E7ANCNFSM4I27PTFA
ã-
æ¬å ·
Nikos Katsikanis
ãããåé¿ããããã«ããã©ãŠã¶ã«@ firebase / testingãã€ã³ããŒãããŠã¿ãŸããã ããã¯å®éã«ã¯æ©èœããŸããã§ããã ãã ããããã¯è¡ããŸãã@ firebase / tests sourceããã³ã°ã«ããŠã次ã®ãããã«ç·šéããããã£ã³ã¯ãã³ããŒããŸãã
import firebase from "firebase/app"
import * as component from "@firebase/component"
import * as util from "@firebase/util"
import { __awaiter, __generator } from "tslib"
function createUnsecuredJwt(auth) {
// Unsecured JWTs use "none" as the algorithm.
var header = {
alg: 'none',
kid: 'fakekid'
};
// Ensure that the auth payload has a value for 'iat'.
auth.iat = auth.iat || 0;
// Use `uid` field as a backup when `sub` is missing.
auth.sub = auth.sub || auth.uid;
if (!auth.sub) {
throw new Error("auth must be an object with a 'sub' or 'uid' field");
}
// Unsecured JWTs use the empty string as a signature.
var signature = '';
return [
util.base64.encodeString(JSON.stringify(header), /*webSafe=*/ false),
util.base64.encodeString(JSON.stringify(auth), /*webSafe=*/ false),
signature
].join('.');
}
function initializeApp(accessToken, options) {
var _this = this;
var app = firebase.initializeApp(options);
if (accessToken) {
var mockAuthComponent = new component.Component('auth-internal', function () {
return ({
getToken: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
return [2 /*return*/, ({ accessToken: accessToken })];
}); }); },
getUid: function () { return null; },
addAuthTokenListener: function (listener) {
// Call listener once immediately with predefined accessToken.
listener(accessToken);
},
removeAuthTokenListener: function () { }
});
}, "PRIVATE" /* PRIVATE */);
app._addOrOverwriteComponent(mockAuthComponent);
}
return app;
}
export function initializeTestApp(options) {
let accessToken = undefined
if (options.auth !== undefined) {
accessToken = createUnsecuredJwt(options.auth)
}
return initializeApp(accessToken, options)
}
ããã§ãã¢ããªã®ãã©ãŠã¶ãŒåŽã®ã³ãŒãã§ããããã€ã³ããŒãã§ããŸãã
let app
if (dev) {
app = initializeTestApp({projectId: "test", auth: {uid: "testuser"}})
app.firestore().settings({
host: "localhost:8080",
ssl: false,
})
} else {
app = firebaseProduction.initializeApp({ firebase config here })
app.firestore().settings({ firestore config here })
}
window.firebase = app
ããã¯ããŸããããŸãïŒ çŸåšãéçºäžã®å Žåããšãã¥ã¬ãŒã¿ãŒããtestuserããšèŠãªãããŒã«ã«ã®åœã®ãŠãŒã¶ãŒãããŸãïŒFirestoreã»ãã¥ãªãã£ã«ãŒã«ã®ãã¹ãã¬ã€ãã«ç€ºãããŠããããã«ïŒã
ç§ã䜿çšããå¥ã®åé¿çã¯ãèªèšŒãã¹ã¿ãåããããšã§ãïŒãã¹ãã«ã¯çæãããåœã®ãŠãŒã¶ãŒã䜿çšããŠããŸãïŒã
TypeScriptã®äŸïŒ
import type { User as AuthUser } from '@firebase/auth-types'
// not importing a type, but a module of types
import { auth as authTypes} from 'firebase/app'
type Auth = authTypes.Auth
export const authStub = {
getUser(uid: string) {
// for uids like `testuser1234uid`
let n = uid ? uid.replace("testuser", '').replace("uid", '') : ''
return Promise.resolve({
uid,
email: `test.user${n}@foo.com`,
emailVerified: true,
providerData: [{
providerId: 'google.com',
email: `test.user${n}@foo.com`,
uid: `testuser${n}provideruid`,
phoneNumber: null,
displayName: `Test User ${n}`.trim(),
photoURL: 'https://thispersondoesnotexist.com/image',
}],
metadata: {
// https://firebase.google.com/docs/reference/admin/node/admin.auth.UserMetadata
createTime: new Date().toUTCString(),
lastSignInTime: new Date().toUTCString()
},
customClaims: {
username: `testuser${n}`
}
})
},
deleteUser(uid: string) {
return Promise.resolve()
},
async updateUser(uid: string, data: AuthUser) {
let user = await this.getUser(uid)
return { ...user, data }
},
setCustomUserClaims(uid: string, customUserClaims: Object): Promise<void> {
return Promise.resolve()
}
}
export const auth = <Auth><unknown>authStub
ãŸãã auth.token
ã¯ãšãã¥ã¬ãŒããããªããããã«ãŒã«ãå€æŽããŠãã ããã äŸãã°ïŒ
const rules = fs.readFileSync(__dirname + '/src/firebase/firestore/firestore.rules', 'utf8')
const modifiedRules =
rules
.replace(/request\.auth\.token\.email_verified/g, "true")
.replace(/request\.auth\.token\.firebase\.sign_in_provider/g, "'password'")
await firebase.loadFirestoreRules({ projectId, rules: modifiedRules })
ããã¯ç§ã«ãšã£ãŠçŽ æŽãããåããããŠããŸãã ããã圹ã«ç«ãŠã°å¹žãâŠ
ãã®ã¹ã¬ããããã©ããŒããŠããŠãFirebase Authentication Emulatorã®Alphaãã¹ã¿ãŒã«ââãªãããšãããšããªãå Žåã¯ã次ã®æé ã«åŸã£ãŠãã ããã
åæ段éã®ãšãã¥ã¬ãŒã¿ãŒãè©ŠããŠãã£ãŒãããã¯ãæäŸããããšã«çå£ã«èå³ãããå Žåã«ã®ã¿ããããè¡ã£ãŠãã ããã ãã°ããããã»ããã¢ããã®äžéšãé£ããã§ãããããç§ãã¡ã¯ããªããã©ãæããç¥ãããã§ãã
@samtsternããã¯çŽ æŽããããã¥ãŒã¹ã§ãïŒ è©ŠããŠã¿ããã®ã§ãããé±æ«ãŸã§ã«çŸåšã®ãããžã§ã¯ãã§å¶äœããäºå®ãªã®ã§ãä»ã¯éã¶äœè£ããããŸããã ç§ãã§ããéãæ©ãã¢ã«ãã¡ã«ãµã€ã³ã¢ããããŸã:)çŽ æŽãããä»äºãããããšãã
100ïŒ ãããè©ŠããŠã¿ãããšæããŸãïŒ ããªãã®ç·ãµã ïŒ
@samtsternã¯ãããè©ŠããŠãç§ãã§ããããšã¯äœã§ãå©ããããšã楜ãã¿ã«ããŠããŸãïŒ
AndroidããããŒã«ã«ã§é¢æ°ããã¹ãããã«ã¯ãauthã®æ©èœã䜿çšããå¿ èŠããããŸããAuthã®ã³ã³ããã¹ãã¯åžžã«nullã§ãã
æå ±ã§ããAuthenticationEmulatorã¯æ°ãã
é 匵ã£ãŠãããŠããããšã@ samtsternðª
çŽ æŽããã人ãã¡ïŒ
ç§ã¯ãã ã®ã¡ãã»ã³ãžã£ãŒã§ãïŒ Authãšãã¥ã¬ãŒã¿ãŒã¯99ïŒ ã@yuchenshiã«ãã£ãŠãŸãã...ãã®ããã圌ãç®ãèŠãŸãããšãã«ãã®åé¡ã解決ã§ããããšãå æ ã«æããŸãã
ãã®æ°ãããšãã¥ã¬ãŒã¿ã«é¢ããããã¥ã¡ã³ãã¯ãããŸããïŒ ïŒã¯ã©ã€ã¢ã³ãã®ã€ã³ã¹ããŒã«ãæ§ææ¹æ³ãªã©ïŒ
PSããã«é¢ãããã¹ãŠã®ããŒãã¯ãŒã¯ã«æè¬ããŸãã ããã«ãããããããçš®é¡ã®ã¯ãŒã«ãªãã®ãå¯èœã«ãªããŸãã
@nicoburnsããã«ïŒ å ¬åŒçºè¡šãããã¥ã¡ã³ãããã®ä»ãã¹ãŠã®åªããæ©èœããŸããªãç»å ŽããŸãã
çŽ æŽããããã¥ãŒã¹ïŒ :)ãããè©ŠããŠã¿ãã®ãåŸ ã¡ãããŸãã:)
ç§ã¯ããªãããããåŸ ã£ãŠããã®ãç¥ã£ãŠããã®ã§ãèŠç¹ã«åã蟌ã¿ãŸãããïŒ
**æ¥ç¥ãããªãã©ã°ã€ã³ïŒæ¬æ¥åŸåã«ãFirebaseãšãã¥ã¬ãŒã¿ã¹ã€ãŒãã䜿çšããŠCIãèšå®ããæ¹æ³ãã«é¢ããã»ãã·ã§ã³ãè¡ã£ãŠããŸãã ã»ãã·ã§ã³ã¹ã±ãžã¥ãŒã«ã§ãããèŠã€ããããšã¯ãèªè ã®ç·Žç¿åé¡ãšããŠæ®ãããŠããŸãã
_P.Sã Auth Emulatorã¯ãã¡ããããŒã ã¯ãŒã¯ãªã®ã§ã99ïŒ ã®ã¯ã¬ãžãããååŸããããšã¯ã§ããŸããã FirebaseãšFirebaseéçºè ïŒããªãïŒã®ããŸããŸãªäººã ãããã«å€§ããªåœ¹å²ãæãããŸããã ããããšãããããŸããïŒ_
@yuchenshi Firestoreãšãã¥ã¬ãŒã¿ãŒã®å Žåãšåæ§ã«ãäœæãããŠãŒã¶ãŒãçµäºæã«ãšã¯ã¹ããŒãããããšã¯ã§ããŸããïŒ
@vdjurdjevicã¯ãŸã ãçŸåšåãçµãã§ããŸãã
ããã¯éåžžã«äººæ°ã®ããåé¡ã§ãããæŽæ°ãããã³ã«50ã100人ã«éç¥ãããŸãã Authãšãã¥ã¬ãŒã¿ãŒããªãªãŒã¹ããã®ã§ãä»åŸã®æŽæ°ãããã®åé¡ãããã¯ããŸãã 質åããã°ããŸãã¯æ©èœã®ãªã¯ãšã¹ããããå Žåã¯ãæ°ããåé¡ãéå§ããŠãã ããã
æãåèã«ãªãã³ã¡ã³ã
ç§ãã¡ã¯å®å šãªèªèšŒãšãã¥ã¬ãŒã¿ãŒã«åãçµãã§ããŸãã
ã¿ããªã欲ããã çŸåšæäŸã§ããã¿ã€ã ã©ã€ã³ã¯ãããŸããããåªå 床ãé«ãã§ã
ç§ãã¡ã®ããã«ã
8:12 ChuckBã®ã§éã2020幎5æ22æ¥ã«[email protected]æžããŸããïŒ