Firebase-tools: рдПрдореБрд▓реЗрдЯрд░ рд╕реВрдЯ рдореЗрдВ рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдПрдореБрд▓реЗрдЯрд░ рдЬреЛрдбрд╝реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рд╕рд┐рддре░ 2019  ┬╖  66рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: firebase/firebase-tools

рдХреНрдпрд╛ рддреЗрдЬреА рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдФрд░ рдЕрдВрдд рд╕реЗ рдЕрдВрдд рддрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдПрдкреАрдЖрдИ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╛рддрд╛рд╡рд░рдг (рджреЗрд╡, рдкрд░реАрдХреНрд╖рдг, рд╕реНрдЯреЗрдЬрд┐рдВрдЧ, рдкреНрд░реЛрдб) рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╡реЙрдЪ рдореЛрдб рдореЗрдВ рдЬреЗрдПрд╕рдУрдПрди рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рдПрдореБрд▓реЗрдЯрд░, рдмреАрдЬ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╕реАрдбрд┐рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЯреЗрд╕реНрдЯ рдХреЗрд╕, рдЖрджрд┐ред рдПрдВрдб рдЯреВ рдПрдВрдб рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рд╣реИ, рднреВрдорд┐рдХрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди, рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ, рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рд╡рд╣рд╛рдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реАрдб рдФрд░ рдХреНрд▓рд┐рдпрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдПред

emulator-suite feature request

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рдо рдПрдХ рдкреВрд░реНрдг рдСрде рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рди рд╣реИрдВ рдЬреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрдЧрд╛
рд╕рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВ рдЕрднреА рдХреЛрдИ рд╕рдордпрд░реЗрдЦрд╛ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ
рд╣рдорд╛рд░реЗ рд▓рд┐рдПред

рд╢реБрдХреНрд░, 22 рдордИ 2020 8:12 рдкреВрд░реНрд╡рд╛рд╣реНрди ChuckB рдкрд░ рдкрд░ [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

@samtstern https://github.com/samttern рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп
рдЗрд╕ рдореБрджреНрджреЗ/рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди? рдореБрдЭреЗ (1) setEmulatedUser рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдХреНрд▓рд╛рдЙрдб рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдПрдореБрд▓реЗрдЯрд░ рддрд╛рдХрд┐ рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреВрдВред

рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░: 17 рдЕрдХреНрдЯреВрдмрд░ 2019 рдХреЛ
_рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ (2) рд╕рд╣реА рдХрд╣рд╛рдиреА рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛
рдХрд┐рддрдиреЗ рд▓реЛрдЧ рдЦреБрд╢ рд╣реЛрдВрдЧреЗ (1) рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ
рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдмрдирд╛рдП рд░рдЦрдирд╛ред

(1) рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдпрд╛ рд░реАрдпрд▓рдЯрд╛рдЗрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдЬреИрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ рдмрд┐рдирд╛
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдирд╛ред рдЕрднреА рддреЛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ
setEmulatedUser рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдлрд░реНрдЬреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛
рдЯреЛрдХрди рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╣реИ рдХрд┐ рдЕрдиреБрдХрд░рдгрдХрд░реНрддрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдЙрддреНрдкрд╛рдж рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд╛, рдЕрдзрд┐рдХ рдЕрд▓рдЧрд╛рд╡, рдЖрджрд┐._

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-632660684 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ACATB2Q4LV7NXMQFEALNPXLRSZT25ANCNFSM4I27PTFA
.

рд╕рднреА 66 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@vladimirdjurdjevic рдЗрд╕реЗ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рд╣рдорд╛рд░реЗ рдХрд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЕрднреА рддрдХ рдпрд╣ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреА рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реЗрд╡рд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд░рдгрдиреАрддрд┐ рдХреНрдпрд╛ рд╣реИред рдХреБрдЫ рдЪреАрдЬреЗрдВ (рдЬреИрд╕реЗ рдЕрдирд╛рдо рд▓реЗрдЦ) рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдЬрдмрдХрд┐ рдЕрдиреНрдп (рдЬреИрд╕реЗ рдПрд╕рдПрдордПрд╕ рдкреНрд░рдорд╛рдгреАрдХрд░рдг) рдмрд╣реБрдд рдХрдард┐рди рд╣реИрдВред

рд▓реЗрдХрд┐рди рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдПрдВрдб-рдЯреВ-рдПрдВрдб рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ!

рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдерд╛ рдЬреЛ рдЖрдкрдХреЛ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдПрдХ рдлрд╛рдпрд░рдмреЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рдерд╛? рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

firebase.auth().setEmulatedUser({
   uid: 'abc123',
   // ...
});

@samtstern рдХреНрдпрд╛ setEmulatedUser() рдкрд░ рдХреЙрд▓ рднреА рдХрд┐рд╕реА рднреА functions.auth.user().onCreate() рдПрдореБрд▓реЗрдЯреЗрдб рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛? рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

@samtstern рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪреЗрдВ, рдФрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ (рдСрдлрд▓рд╛рдЗрди рд╢рд╛рдпрдж) рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВред рдПрдХ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдЧрд░ рд╣рдо рдПрдХ рд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рддрд╣рдд рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдФрд░ рдСрде рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрдИ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░рддрд┐ рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЧрдзреЗ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджрд░реНрдж рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛, рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рдХреГрддрд┐ рдмрдирд╛рдирд╛, рдЖрджрд┐ред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХ рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдпрджрд┐ рдореБрдЭреЗ рдореИрдиреНрдпреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбрдореА рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдХреЗрд╡рд▓ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рд╡рд╣рд╛рдВ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

@noelmansour рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓ рд╣реИ! рдРрд╕рд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╣рдо рд╢рд╛рдпрдж signInAsEmulatedUser рдФрд░ signUpAsEmulatedUser рдЬреИрд╕реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрд▓ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХреЗрд╡рд▓ рджреВрд╕рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред

@vladimirdjurdjevic рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдПрдХ рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╡рд╛рд▓рд╛ рдПрдореБрд▓реЗрдЯрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг" рд╕реЗ рдЖрдкрдХреЛ рдХрд┐рди рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ?

рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдерд╛ рдЬреЛ рдЖрдкрдХреЛ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдПрдХ рдлрд╛рдпрд░рдмреЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рдерд╛?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА, рдЗрд╕рд╕реЗ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓реЗрдЧреАред
рдЕрднреА рдореИрдВ рдХреЗрд╡рд▓ true рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╣рд░ рдмрд╛рд░ рдЬрдм рдореБрдЭреЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд▓реЙрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд┐рдпрдо рдлрд╝рдВрдХреНрд╢рди, рдпрд╣ рдмрд╣реБрдд рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдлрд┐рд░ рднреА рд╢рд╛рдпрдж рд╕рд░рд▓ рдЪреАрдЬ рдЬреЛ рдореИрдВ рдЕрдиреБрдХрд░рдг рдХрд┐рдП рдЧрдП рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рд╣рд╛рдБ рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛

рдореИрдВ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг functions.auth.user().onCreate() рднреА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ onCreate рдФрд░ рдирдХрд▓реА user рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддрд╛ рд╣реИред

рдЙрд╕ рддрд░рд╣ рдХреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдлрд╛рдпрд░рдмреЗрд╕-рдлрд╝рдВрдХреНрд╢рдВрд╕-рдЯреЗрд╕реНрдЯ рджреЗрдЦреЗрдВ
рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЬреЛ рдЖрдкрдХреЛ рдирдХрд▓реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рд╕реВрд░реНрдп рдкрд░, рдЕрдХреНрдЯреВрдмрд░ резрей, реирежрезреп, рел:рекрек рдкреВрд░реНрд╡рд╛рд╣реНрди рдбреИрдирд┐рдпрд▓ рдХреЗ. рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдореИрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рднреА рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛редauth.user().onCreate()ред рдореИрдВ
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЕрднреА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХреЙрд▓рдмреИрдХ рд╣реИ
рдлрд╝рдВрдХреНрд╢рди рдСрдирдХреНрд░рд┐рдПрдЯ рдкрд░ рдкрд╛рд░рд┐рдд рд╣реБрдЖ рдФрд░ рдЙрд╕ рдкрд░ рдирдХрд▓реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/firebase/firebase-tools/issues/1677?email_source=notifications&email_token=ACATB2QYJLX2LNVDTWJV25TQOMJ4VA5CNFSM4I27PTFKYY3PNVWWK3WTUL52HS4DFVREXG43VMVHHQ#TEBZLEBNMV
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ACATB2SO3IR6UB73F4EMZPTQOMJ4VANCNFSM4I27PTFA
.

@samtstern рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореБрдЭреЗ рдпрд╣ рдЖрднрд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╣реИред

image
https://firebase.google.com/docs/functions/unit-testing#initializing

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдСрдирд▓рд╛рдЗрди рдореЛрдб рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рдпрд╣ рдПрдХ рдзреАрдореА рдЧрддрд┐ рд╣реЛрдЧреАред рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ "рд╕реНрдЯрдмрд┐рдВрдЧ" рджреНрд╡рд╛рд░рд╛ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдПрдореБрд▓реЗрдЯрд░ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВред

@FredyC рдЙрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╢рдмреНрдж рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ "рдореЛрдб" рдПрдХ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рдХреЗрд╡рд▓ рдЙрди рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдПрдореБрд▓реЗрдЯрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рдХреЛрдб рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк FIRESTORE_EMULATOR_HOST рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдлрд╛рдпрд░рдмреЗрд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдПрд╕рдбреАрдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдПрдореБрд▓реЗрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ ( firebase emulators:exec рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ)ред

@samtstern рдореБрдЭреЗ рдЕрднреА рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдм рдореБрдЭреЗ functions.auth.user().onCreate() рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░реЗрдЧрд╛? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрд╛рджрди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрдЬрд╛рдп рдПрдореБрд▓реЗрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рд╣реИ, рд╣реИ рдирд╛? рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдХреЛ рдХрд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХреИрд╕реЗ рдХрд░реВрдВ?

рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдлрд╛рдпрд░рдмреЗрд╕-рдлрд╝рдВрдХреНрд╢рдВрд╕-рдЯреЗрд╕реНрдЯ рдореЗрдВ рдХреБрдЫ рдЧреВрдврд╝ рд╡рд┐рдзрд┐ makeUserRecord рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВрдиреЗ auth.createUserWithEmailAndPassword() рдХреЛ @firebase/testing рдкреИрдХреЗрдЬ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдорд╛рдиреНрдп API рдХреБрдВрдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдСрдирд▓рд╛рдЗрди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдЬрдм рдореИрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд env рдЪрд░ рдХреЗ рд▓рд┐рдП org рдХреЗ

рдореИрдВ https://github.com/firebase/functions-samples рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╣рд╛рдВ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ред

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕рдХрд╛ рдХреБрдЫ рдЕрд░реНрде рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ? :)

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рднреА рд╣реИ, рдХреБрдЫ рд╣рдж рддрдХ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб admin.auth().getUserByEmail() рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореИрдВ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреИрд╕реЗ рдмрдирд╛рдКрдВрдЧрд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдкреВрд░реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рддреЗ рд╣реБрдП, рд▓реЗрдХрд┐рди рд╡рд╣ рдкрд╛рдЧрд▓ рд╣реИ :)

@samtstern рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рдЬрдм рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХрд╣рддрд╛ рд╣реВрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ: рдбреА рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдореИрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХреЛрдгреАрдп рдкрд░реНрдпрд╛рд╡рд░рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕реНрд╡реИрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдореЗрд░реЗ рдРрдк рдЬреИрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреАрдЖрдИ рд╕реЗ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рдПрдореБрд▓реЗрдЯрд░ рд╣реИ рдорд╢реАрди, рдФрд░ рдореИрдВ рдЗрд╕реЗ рдСрдлрд╝рд▓рд╛рдЗрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдм, рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрд╕рдПрдордПрд╕ рднреЗрдЬрдиреЗ рдХреА рдЪреБрдиреМрддрд┐рдпреЛрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реЛрдЧрд╛ рдХрд┐ рдПрдореБрд▓реЗрдЯрд░ рдореЗрд░реЗ рдлреЛрди рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрд╕рдПрдордПрд╕ рднреЗрдЬреЗ, рд▓реЗрдХрд┐рди рдЖрдк рд╢рд╛рдпрдж рдЗрд╕реЗ рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдПрд╕рдПрдордПрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдЬреЛ рднреЗрдЬреА рдЬрд╛рдПрдЧреА)ред рдЗрд╕рдХреЗ рд╕рд╛рде рдореВрд▓реНрдп рд╕реЗ рд╢рд╛рдпрдж рдпрд╣ рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рдиреА рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрдИ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╕реЗ рд╕рд╛рдорд╛рди рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реЗрд╡рд╛ рдЦрд╛рддреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рднреА рдПрдХ рджрд░реНрдж рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╣рд░ рдЧреИрд░-рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдкреНрд░рддрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрдИ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реИред

@FredyC рдЖрдкрдХреА рд╕рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рджреЗрдЦрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорджрджрдЧрд╛рд░ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд▓реЛрдЧ рджреЛ рдореБрдЦреНрдп рдЪреАрдЬреЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  1. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдпрд╛ рд░реАрдпрд▓рдЯрд╛рдЗрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдЬреИрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВред рдЕрднреА рдпрд╣реА setEmulatedUser рдЬреИрд╕рд╛ рдХреБрдЫ рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдПрдХ рдлрд░реНрдЬреА рдСрде рдЯреЛрдХрди рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЕрдиреБрдХрд░рдгрдХрд░реНрддрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░реЛрдб рджреНрд╡рд╛рд░рд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд╛, рдЕрдзрд┐рдХ рдЕрд▓рдЧрд╛рд╡, рдЖрджрд┐ред
  2. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдзреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЯреБрдХрдбрд╝реЗ рд╣реЛрдВрдЧреЗ:
    рдПред рдПрдХ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдПрдореБрд▓реЗрдЯрд░ рдЬреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЙрд╕ рдкрд░ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдПрд╕рдбреАрдХреЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХреЗрдВред
    рдмреАред рдЙрд╕ рдПрдореБрд▓реЗрдЯрд░ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рдмреАрдЪ рдПрдХреАрдХрд░рдг рддрд╛рдХрд┐ .onCreate рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рдПрдВред
    рд╕реАред рдлрдВрдХреНрд╢рди рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдСрдЯреЛ-рдореЙрдХрд┐рдВрдЧ рддрд╛рдХрд┐ admin.auth() рдСрде рдПрдореБрд▓реЗрдЯрд░ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗ, рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ рд╣рдо рдЖрдЬ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдФрд░ рдЖрд░рдЯреАрдбреАрдмреА рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ (2) рд╕рд╣реА рдХрд╣рд╛рдиреА рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХрд┐рддрдиреЗ рд▓реЛрдЧ рдЦреБрд╢ рд╣реЛрдВрдЧреЗ (1) рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдмрдирд╛рдП рд░рдЦрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред

@samtstern рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ (1) рдкрд╣рд▓реЗ рд╣реА рд╣рд▓ рдирд╣реАрдВ рд╣реЛ рдЧрдпрд╛ рд╣реИ? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдореИрдВ рдХреЗрд╡рд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдПрдореБрд▓реЗрдЯрд░ рдореБрдЭреЗ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рди рд▓реЗрдЧрд╛ рддрд╛рдХрд┐ рдореИрдВ рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдореЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреВрдВред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рддрдХ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рддрдХ рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ :)

  const app = firebase.initializeTestApp({
    projectId,
    auth: {
      uid: 'owner'
    }
  })

(2) рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдкреВрд░реЗ рдЙрддреНрдкрд╛рдж рдореЗрдВ рдореЗрд░реА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдЗрддрдиреА рд╕реАрдорд┐рдд рд╣реИ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рднреА рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдХрд╡рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕реЗ рдЬреНрдЮрд╛рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдФрд░ рдЪрд▓рддреЗ-рдлрд┐рд░рддреЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдПрдВред рдореЗрд░реА рд╕реАрдорд┐рдд рд░рд╛рдп рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЯреНрд░рд┐рдЧрд░реНрд╕ рдХреЗ рд╕рд╛рде "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕" рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

@FredyC рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ (1) рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рдПрдВрдбреНрд░реЙрдЗрдб/рдЖрдИрдУрдПрд╕/рд╡реЗрдм рдРрдк рдХреЛ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдПрдореБрд▓реЗрдЯрд░ рд╕реЗ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк @firebase/testing рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЪреНрдЫрд╛ рдРрд╕рд╛ рд╣реИред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ @firebase/testing рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рд╕рдВрдЪрд╛рд░ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП FIRESTORE_EMULATOR_HOST рд╣реИ? рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ FIREBASE_EMULATOR_HOST рдЬреИрд╕рд╛ рдХреБрдЫ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ рдпрджрд┐ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рдкрд╛рд╕ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдПрдВ рднреА рд╣реЛрдВрдЧреАред

@vladimirdjurdjevic рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ signInWithPhone рд╡рд┐рдзрд┐ рдХрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВ? рдлрд┐рд░ рдЖрдкрдХреЛ рдПрдХ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕рд┐рдореНрдпреБрд▓реЗрдЯреЗрдб рдПрд╕рдПрдордПрд╕ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ :)

рдмреЗрд╢рдХ, рдлрд┐рд░ рдЖрдкрдХреЛ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдХреЗ рд▓рд┐рдП рдПрдореБрд▓реЗрдЯрд░ рдХреА рдУрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдФрд░ рдЗрд╕рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ)ред рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ https://github.com/firebase/firebase-tools/issues/1677#issuecomment -542897671 рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЯреЛрдХрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐ рд╣реИ: https://github.com/firebase/firebase-js-sdk/blob/master/packages/testing/src/api/index.ts#L64ред рдпрдХреАрди рдирд╣реАрдВ рд╣реЛрддрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдмреЗрд╢рдХ, рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рд╣рдореЗрд╢рд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЗрд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдпрд╣ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпреЗ рд╕рд╛рдЗрдирдЗрди рд╡рд┐рдзрд┐рдпрд╛рдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдлреЗрдВрдХ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдХрд┐ рдХреБрдЫ рдЙрдЪрд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдордЬрд╛рдХ рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рд╣реИред

@samtstern firebase.auth() рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рдВрджрд░реНрдн рдХреЛ setEmulatedUser рдЬреИрд╕реЗ рдХреБрдЫ рд╕рд╛рдордпрд┐рдХ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдореМрдЬреВрджрд╛ рдЕрдиреБрдХрд░рдг рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╡рд╣ рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╢рд╛рдпрдж рдкреИрдХреЗрдЬ рдкрдХреНрд╖ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд╢реАрд▓рддрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИ?

рдЕрдиреНрдп рдЕрдиреБрдХрд░рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЗрдирд▓рд╛рдЗрди, рдореИрдВ HTTP рдкрд░ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗрд╡рд╛ рд╕реНрддрд░ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рд╕рддрд╣ рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо/рдкрд╛рд╕рд╡рд░реНрдб рдкрд░ рдореВрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реАрдЖрд░рдпреВрдбреА рдХрд╛ рдиреНрдпреВрдирддрдо рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдХреНрд╖рдг AuthN рдорд╛рдорд▓реЛрдВ рдХреА рд╡рд╛рдкрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред рд╣реЗрдХ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдореЗрдВ рдХрд╕реНрдЯрдо рдЯреЛрдХрди рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рдФрд░ signInWithCustomToken рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рджреВрд░ рддрдХ рдЬрд╛рдПрдЧрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдбреЙрдХреНрд╕ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдПрдкреАрдЖрдИ рд╕рдкреЛрд░реНрдЯ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рд▓реЛ рд╣реИрдВрдЧрд┐рдВрдЧ рдлреНрд░реВрдЯ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

@FredyC рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП, рдПрдХреАрдХрд░рдг initializeTestApp рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд░реВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ @firebase/testing рдХреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдХреНрд░рд┐рдпрд╛ рджреЛрдиреЛрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдб-рдЯрд╛рдЗрдо рдкрд░ рдкреИрдХреЗрдЬ рдмрд╣рд┐рд╖реНрдХрд░рдг рдкрд░ рдЬреЛрд░ рджреЗрддреА рд╣реИ, рдФрд░ рдПрдореБрд▓реЗрдЯрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рджреЛ рдкреИрдХреЗрдЬ рдПрдкреАрдЖрдИ ( initializeTestApp рдФрд░ firestore.settings / functions.useFunctionsEmulator ) рдореЗрдВ рднреА рдлреИрд▓рд╛рддреА рд╣реИред

рдЧреНрд░рд╣ рд╣реИрдХ!

рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рд░рдгрдиреАрддрд┐ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдкрд░реАрдХреНрд╖рдг @firebase/testing рдХреЛ рдХрд╕реНрдЯрдо initializeTestApp рдХреЙрд▓ рдкрд░ рд░реВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╣реИред

рдЙрдо, рдореИрдВ рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдВрджрд░ рдмреБрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВред рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдпрдорд┐рдд initializeApp index.ts рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред рдПрдореБрд▓реЗрдЯрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╢рд░реНрдд рдЖрдпрд╛рдд рдХрд╛ рдХреЛрдИ рдмреЛрдЭ рдирд╣реАрдВ рд╣реИред

рдмреЗрд╢рдХ, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡реЗрдм рдРрдк рдЬрд╣рд╛рдВ рдЯреЗрд╕реНрдЯ рд░рдирд░ рдРрдк рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд╛рдЭрд╛ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдРрдк рдХреЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред initializeApp рд╢рд╛рдпрдж рдХреБрдЫ рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдмрд┐рд▓реНрдХреБрд▓ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@FredyC рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрд┐рдд рдЙрдкрдпреЛрдЧреЛрдВ рдкрд░ рд╕рд╣рдордд рд╣реБрдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░реНрдг-рдРрдк рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЛрд▓ рд░рд╣рд╛ рдерд╛ рдЬрд╣рд╛рдВ рдПрдкрд┐рд╕ рдбрд╛рдпрд╡рд░реНрдЬ рдФрд░ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЖрдпрд╛рдд рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рдирдХреНрд╢реЗ рд╕реЗ рджреВрд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдореИрдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ Honestly, it would be kinda superb if @firebase/testing could be used cross-platform instead of having separate solutions рд▓рд┐рдП рдПрдЯреНрд░рд┐рдмреНрдпреВрд╢рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╛рдИ рдлрд╛рдЗрд╡

@FredyC рдЖрдкрдХреА рд╕рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рджреЗрдЦрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорджрджрдЧрд╛рд░ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд▓реЛрдЧ рджреЛ рдореБрдЦреНрдп рдЪреАрдЬреЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  1. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдпрд╛ рд░реАрдпрд▓рдЯрд╛рдЗрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдЬреИрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВред рдЕрднреА рдпрд╣реА setEmulatedUser рдЬреИрд╕рд╛ рдХреБрдЫ рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдПрдХ рдлрд░реНрдЬреА рдСрде рдЯреЛрдХрди рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЕрдиреБрдХрд░рдгрдХрд░реНрддрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░реЛрдб рджреНрд╡рд╛рд░рд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд╛, рдЕрдзрд┐рдХ рдЕрд▓рдЧрд╛рд╡, рдЖрджрд┐ред
  2. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдзреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЯреБрдХрдбрд╝реЗ рд╣реЛрдВрдЧреЗ:
    рдПред рдПрдХ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдПрдореБрд▓реЗрдЯрд░ рдЬреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЙрд╕ рдкрд░ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдПрд╕рдбреАрдХреЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХреЗрдВред
    рдмреАред рдЙрд╕ рдПрдореБрд▓реЗрдЯрд░ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рдмреАрдЪ рдПрдХреАрдХрд░рдг рддрд╛рдХрд┐ .onCreate рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рдПрдВред
    рд╕реАред рдлрдВрдХреНрд╢рди рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдСрдЯреЛ-рдореЙрдХрд┐рдВрдЧ рддрд╛рдХрд┐ admin.auth() рдСрде рдПрдореБрд▓реЗрдЯрд░ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗ, рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ рд╣рдо рдЖрдЬ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдФрд░ рдЖрд░рдЯреАрдбреАрдмреА рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ (2) рд╕рд╣реА рдХрд╣рд╛рдиреА рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХрд┐рддрдиреЗ рд▓реЛрдЧ рдЦреБрд╢ рд╣реЛрдВрдЧреЗ (1) рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдмрдирд╛рдП рд░рдЦрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред

@samtstern рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдирд╣реАрдВред 1 e2e рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореБрдЭреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬрдмрдХрд┐ рдореИрдВ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ, рдирд┐рдпрдо, рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдореБрд▓реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ firebase.initializeTestApp рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП setEmulatedUser рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдмрдорд┐рдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдХрд╕реНрдЯрдо рдЯреЛрдХрди рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ред

рдирдореВрдирд╛ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдРрдк рдореЗрдВ firebase.auth().signInWithCredential(credential) рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП

рд╣рдо рддреАрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдореБрд▓реЗрдЯрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ:

  1. e2e рдкреВрд░реЗ рдРрдк рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ @vladimirdjurdjevic рдиреЗ рдХрд╣рд╛ред
  2. рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг, рдЬрд╣рд╛рдВ рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдлрд╛рдпрд░рдмреЗрд╕ рдкрд░ рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  3. рд╣рдорд╛рд░реЗ рд╕рднреА рдбреЗрд╡рд▓рдкрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдПрдХ рдХреЗрдВрджреНрд░реАрдп рдлрд╛рдпрд░рдмреЗрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рдЯрдХреНрдХрд░реЗрдВ рд╣реЛрддреА рд╣реИрдВред рдмреЗрд╢рдХ, рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЕрднреА рднреА рдлрд╛рдпрд░рдмреЗрд╕ рдбреИрд╢рдмреЛрд░реНрдб рдореЗрдВ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред рд╕рд╛рде рд╣реА, рд╣рдо рдЕрдкрдиреЗ рдРрдк рдХреЛ рдСрдлрд╝рд▓рд╛рдЗрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдореБрд▓реЗрдЯрд░ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдЖрдЬ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬрд▓реНрдж рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рдЬрд╛рд░реА рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдЖрдкрдХреЗ рдЙрддреНрдкрд╛рдж рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдореВрд▓реНрдпрд╡рд╛рди рдмрдирд╛ рджреЗрдЧрд╛! рдРрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ!

рдпрд╣ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреА рдЗрдЪреНрдЫрд╛ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред Firebase рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЕрднреА рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд▓рд┐рд╣рд╛рдЬ рд╕реЗ #1 IDaaS рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рджрд░реНрдж рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред рдЖрд╢рд╛ рд╣реИ рдХрд┐ FB рдЯреАрдо рдХреЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬрд▓реНрдж рд╣реА рдЕрдкрдбреЗрдЯ рд╣реЛрдВрдЧреЗ! ЁЯЩП

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: @ рдлрд╛рдпрд░рдмреЗрд╕ -рдСрдкреНрд╕ рд╕реЗ рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ рдореБрджреНрджреЛрдВ рдХреЗ рддрд╣рдд

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рддреНрд░реБрдЯрд┐ рднреА рд╣реИ ... рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдСрде рдПрдореБрд▓реЗрдЯрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рдЗрд╕ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

functions.auth.user().onDelete()

рдЗрд╕ рдкрд░ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА...

@dominikfoldi

рдореИрдВ рдЖрдкрдХреА рдмрд╛рддреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдПрдХ рдЯрд┐рдк рдЬреЛ рдЗрд╕ рдмреАрдЪ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИ:

рдмреЗрд╢рдХ, рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЕрднреА рднреА рдлрд╛рдпрд░рдмреЗрд╕ рдбреИрд╢рдмреЛрд░реНрдб рдореЗрдВ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред

рдЖрдк рдлрд╛рдпрд░рдмреЗрд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реАрдб рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП auth().createUser , рдпрд╣ рднреА рджреЗрдЦреЗрдВ https://firebase.google.com/docs/auth/admin/manage-users

рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдлрд╛рдЙрдВрдбреНрд░реА рдЙрдкрдпреЛрдЧреА рд▓рдЧ рд╕рдХрддреА рд╣реИред

рдореИрдВ рдлрд╛рдЙрдВрдбреНрд░реА рдХреЗ рд╕рд╣-рд╕рдВрд╕реНрдерд╛рдкрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реВрдВред рдлрд╛рдЙрдВрдбреНрд░реА рдПрдХ рд╕реАрдПрд▓рдЖрдИ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдлрд╛рдпрд░рдмреЗрд╕ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдкрдХреЗ рдкреНрд░реЛрдбрдХреНрд╢рди рдлрд╛рдпрд░рдмреЗрд╕ рдРрдк рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд╕реАрдзреЗ рдЕрдкрдирд╛ рдХреЛрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдХреЛрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдлрд╛рдЙрдВрдбреНрд░реА рдЖрдкрдХреА рд╕реНрд░реЛрдд рдХреЛрдб рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЕрдкрдирд╛ рдХреЛрдб рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рд╣реА рд╕реЗрдХрдВрдб рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рджреЗ рджреЗрддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ рд╕реБрдкрд░ рдлрд╛рд╕реНрдЯ рд╣реИред
рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА YAML рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдкрдХреЗ рдЙрддреНрдкрд╛рджрди рдРрдк рд╕реЗ рдХреМрди рд╕реЗ Firestore, RealtimeDB рдФрд░ Auth рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЙрдкрд▓рдмреНрдз рдХрд░рд╛ рд╕рдХреЗрдВред

 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}

рдЖрдк рдпрд╣ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рд╣рдо рдЖрдкрдХрд╛ рдХреЛрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдЖрдкрдХреЗ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХреИрд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЖрдкрдХреЗ рдХреНрд▓рд╛рдЙрдб рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд░рдИрдкреАрдПрд▓ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдк рд╣рдореЗрд╢рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЙрддреНрдкрд╛рджрди рдбреЗрдЯрд╛ рдФрд░ рдЙрддреНрдкрд╛рджрди рдкрд░рд┐рд╡реЗрд╢ рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
рд╕рд╛рде рд╣реА, рдЖрдкрдХреЗ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рди рдРрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╡реЗ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд┐рдП рдЧрдП рд╣реЛрдВред

рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЕрдкрдирд╛ рд╕рддреНрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпреЗ рджреЗрд╡ рдкрд░рд┐рд╡реЗрд╢ рдПрдб-рд╣реЙрдХ рдмрди рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреА рдЯреАрдо рдореЗрдВ рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡реЗ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреЛ рд╕реНрдкреИрдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдЗрд╕рд▓рд┐рдП рдмреЗрдЭрд┐рдЭрдХ рдореБрдЭреЗ рдХреЛрдИ рднреА рдкреНрд░рд╢реНрди рдИрдореЗрд▓ рдХрд░реЗрдВ [email protected]
рдореБрдЭреЗ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдлрд╛рдЙрдВрдбреНрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ, рдмрд╕ рдореБрдЭреЗ рдПрдХ рдИрдореЗрд▓ рднреЗрдЬреЗрдВ!

рдлрд┐рд░ рднреА, рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдФрд░ рдореИрдВрдиреЗ рд╣реЛрдордкреЗрдЬ рдкрд░ рдЬреЛ рдкрдврд╝рд╛, рд╡рд╣ рд╕реЗрд╡рд╛ рдХреНрд▓рд╛рдЙрдб-рдЖрдзрд╛рд░рд┐рдд рд╣реИред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдлрд╛рдпрд░рдмреЗрд╕ рдПрдореБрд▓реЗрдЯрд░ рдСрдлрд╝рд▓рд╛рдЗрди рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ред

@samtstern рдЗрд╕ рдореБрджреНрджреЗ/рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди? рдореБрдЭреЗ рдХреНрд▓рд╛рдЙрдб рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (1) setEmulatedUser рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреВрдВред рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдореНрдпреВрд▓реЗрдЯрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдПрдореБрд▓реЗрдЯрд░ рд╕реНрдЯрд╛рд░реНрдЯ-рдЕрдк рдХреЗ рджреМрд░рд╛рди рдкрд╛рд╕ рдХреА рдЧрдИ рдпреВрдЬрд░ рдЖрдИрдбреА рдХреЗ рддрд╣рдд рдЪрд▓реЗрдЧрд╛ред рдЗрд╕ рддрд░рд╣ рдирд┐рдпрдореЛрдВ рдХрд╛ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░: 17 рдЕрдХреНрдЯреВрдмрд░ 2019 рдХреЛ
_рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ (2) рд╕рд╣реА рдХрд╣рд╛рдиреА рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХрд┐рддрдиреЗ рд▓реЛрдЧ рдЦреБрд╢ рд╣реЛрдВрдЧреЗ (1) рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдмрдирд╛рдП рд░рдЦрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред

(рез) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдпрд╛ рд░реАрдпрд▓рдЯрд╛рдЗрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдЬреИрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВред рдЕрднреА рдпрд╣реА рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреИрд╕реЗ setEmulatedUser рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдПрдХ рдлрд░реНрдЬреА рдСрде рдЯреЛрдХрди рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЕрдиреБрдХрд░рдгрдХрд░реНрддрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░реЛрдб рджреНрд╡рд╛рд░рд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд╛, рдЕрдзрд┐рдХ рдЕрд▓рдЧрд╛рд╡, рдЖрджрд┐._

рд╣рдо рдПрдХ рдкреВрд░реНрдг рдСрде рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рди рд╣реИрдВ рдЬреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрдЧрд╛
рд╕рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВ рдЕрднреА рдХреЛрдИ рд╕рдордпрд░реЗрдЦрд╛ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ
рд╣рдорд╛рд░реЗ рд▓рд┐рдПред

рд╢реБрдХреНрд░, 22 рдордИ 2020 8:12 рдкреВрд░реНрд╡рд╛рд╣реНрди ChuckB рдкрд░ рдкрд░ [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

@samtstern https://github.com/samttern рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп
рдЗрд╕ рдореБрджреНрджреЗ/рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди? рдореБрдЭреЗ (1) setEmulatedUser рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдХреНрд▓рд╛рдЙрдб рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдПрдореБрд▓реЗрдЯрд░ рддрд╛рдХрд┐ рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреВрдВред

рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░: 17 рдЕрдХреНрдЯреВрдмрд░ 2019 рдХреЛ
_рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ (2) рд╕рд╣реА рдХрд╣рд╛рдиреА рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛
рдХрд┐рддрдиреЗ рд▓реЛрдЧ рдЦреБрд╢ рд╣реЛрдВрдЧреЗ (1) рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ
рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдмрдирд╛рдП рд░рдЦрдирд╛ред

(1) рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдпрд╛ рд░реАрдпрд▓рдЯрд╛рдЗрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдЬреИрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ рдмрд┐рдирд╛
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдирд╛ред рдЕрднреА рддреЛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ
setEmulatedUser рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдлрд░реНрдЬреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛
рдЯреЛрдХрди рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╣реИ рдХрд┐ рдЕрдиреБрдХрд░рдгрдХрд░реНрддрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдЙрддреНрдкрд╛рдж рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд╛, рдЕрдзрд┐рдХ рдЕрд▓рдЧрд╛рд╡, рдЖрджрд┐._

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-632660684 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ACATB2Q4LV7NXMQFEALNPXLRSZT25ANCNFSM4I27PTFA
.

1. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдпрд╛ рд░реАрдпрд▓рдЯрд╛рдЗрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдЬреИрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВред рдЕрднреА рдпрд╣реА рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреИрд╕реЗ setEmulatedUser рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдПрдХ рдлрд░реНрдЬреА рдСрде рдЯреЛрдХрди рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЕрдиреБрдХрд░рдгрдХрд░реНрддрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░реЛрдб рджреНрд╡рд╛рд░рд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд╛, рдЕрдзрд┐рдХ рдЕрд▓рдЧрд╛рд╡, рдЖрджрд┐ред

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдирдВрдмрд░ 1 рд╕реЗ рдЦреБрд╢реА рд╣реЛрдЧреА, рдЕрдВрддрд░рд┐рдо рдореЗрдВ

https://stackoverflow.com/questions/62736060/firebase-test-auth-cloud-functions-locally

рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдЕрд╕рдВрднрд╡ рд╣реИ?

@ рдЛрд╖рд┐рд╕рд┐рдВрд╣-рджреЗрд╡ рдПрдХ рдСрде рдПрдореБрд▓реЗрдЯрд░ рдЪрд▓рд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рдПрдореБрд▓реЗрдЯрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдХреЛ рд╢рд┐рдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЙрди рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдЙрдирдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдСрде рдПрдкреАрдЖрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЗрд╕рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯрдЕрдк рдХреА рдирд┐рд╖реНрдард╛ рдХрдо рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ рдбрд┐рдЧреНрд░реА рдХрд╛ рдорд╛рдорд▓рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдорд╛рдорд▓рд╛: рдЖрдк рд╕реАрдзреЗ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЙрдирд╕реЗ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред

рдЙрд╕ 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 рдирд╛рдордХ рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдорд┐рддреНрд░ рдИрдореЗрд▓ рдЗрдирдкреБрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдпреВрдЖрдИрдбреА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕реЗ 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
}

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдореЗрдВ рдХрд┐рд╕реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдПрдкреАрдЖрдИ рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИред рдлрд╛рдпрд░рдмреЗрд╕ рдПрдореБрд▓реЗрдЯрд░ рд╣реЛрдиреЗ рд╕реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмреАрдЪ рд░рдЦрд╛ рдЬрд╛рдПред

рдореИрдВ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЙрдб рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛

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 рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ?

рд╣рд╛рдБ рдЕрдЧрд░ рдпрд╣ рд╕реЗрдЯ рд╣реИ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рдЖрдЬрдорд╛рдпрд╛?

рд╣рд╛рдБ, рдпрд╣ рд╢реВрдиреНрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреНрд▓рд╛рдЙрдб рдкрд░ рдЖрдЬрд╝рдорд╛рдпрд╛ (рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдирд╣реАрдВ)ред

Screen Shot 2020-07-10 at 2 43 12 AM

рдореЗрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИред

exports.sendWelcomeEmail = functions.auth.user().onCreate((user) => {
  console.log(user.uid);
  console.log(user.email);
  console.log(user.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)
    }
}

рд╢реБрдХреНрд░, резреж рдЬреБрд▓рд╛рдИ реирежреиреж рдХреЛ резреж:рекрек рдмрдЬреЗ, рдЛрд╖реАрд╕рд┐рдВрд╣-рджреЗрд╡ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рд╣рд╛рдБ, рдпрд╣ рд╢реВрдиреНрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреНрд▓рд╛рдЙрдб рдкрд░ рдЖрдЬрд╝рдорд╛рдпрд╛ (рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдирд╣реАрдВ)ред

[рдЫрд╡рд┐: рд╕реНрдХреНрд░реАрди рд╢реЙрдЯ реирежреиреж-режрен-резреж рдЕрдкрд░рд╛рд╣реНрди реи рекрей резреи рдмрдЬреЗ]
https://user-images.githubusercontent.com/56976320/87140958-29f3ac80-c257-11ea-98d3-084fad619de7.png

рдореЗрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИред

рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (user.uid);
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (user.email);
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (user.displayName);
});```

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-656587759 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AABU35Q27EMMHYAYU5CNZR3R23PIDANCNFSM4I27PTFA
.

>

рд╕рдзрдиреНрдпрд╡рд╛рдж

рдирд┐рдХреЛрд╕ рдХрдЯреНрд╕рд┐рдХрд╛рдирд┐рд╕реЛ

рд╣рд╛рдВ, рдореЗрд░рд╛ рдкреНрд░рд╛рдердорд┐рдХ рд▓рдХреНрд╖реНрдп onCreate рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдерд╛ред
рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдореБрдЭреЗ displayName рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, onCallable рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛, рдФрд░ рдЗрд╕реЗ рдХрд┐рдпрд╛ред

рдзрдиреНрдпрд╡рд╛рджред

@samtstern рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦрдХрд░ рдмрд╣реБрдд рдЦреБрд╢ рд╣реВрдВ :)

рдПрдХ рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдмрд┐рдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдХреНрд░реЛрдо рдЦреЛрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ

@samtstern

рджреЛ рдорд╣реАрдиреЗ рдмрд╛рдж, рдХреНрдпрд╛ рдЕрдм рдПрдХ рдореЛрдЯрд╛ рдЕрдиреБрдорд╛рди рджреЗрдирд╛ рд╕рдВрднрд╡ рд╣реИ?

рд╣рдо рдЕрдЧрд▓реЗ рд╕рд╛рд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬрд╣рд╛рдЬ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдм рд╣рдореЗрдВ рдЗрд╕ рдирд┐рд░реНрдгрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдпрджрд┐ рд╣рдо рдСрде рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд╣реАрдиреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рдпрд╣рд╛рдВ рд╣рдорд╛рд░реА рдХреБрдЫ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╢реНрд░реЗрд╖реНрда,

рдирд┐рдХрд▓рд╕

Firebase рдкрд░ рд╣рдорд╛рд░реА рдиреАрддрд┐ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдЪреАрдЬрд╝ рдХрдм рд▓реЙрдиреНрдЪ рд╣реЛрдЧреА, рдЬрдм рддрдХ рдХрд┐ рд╣рдо 100% рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рди рд╣реЛрдВред рдЕрднреА рд╣рдо рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╣рдо рд▓реЙрдиреНрдЪ рдХреА рддрд╛рд░реАрдЦ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред

рдпрд╣ рд╣рдорд╛рд░реА рд╕рд░реНрд╡реЛрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдРрдк рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЬ рд╣реА рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ, рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВред

рдареАрдХ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж @samtsternред рдпрд╣ рд╕рд╣рд╛рдпрддрд╛ рдХрд░рддрд╛ рд╣реИ!

рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдСрде рдПрдореБрд▓реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯреЛрдХрди рдкрд░ рдХрд╕реНрдЯрдо рджрд╛рд╡реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╣рдо рдлрд╛рдпрд░рдмреЗрд╕ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдирд┐рдпрдореЛрдВ рдХреЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд╕реНрдЯрдо рджрд╛рд╡реЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдкреВрд░реНрдг рдЕрдзрд┐рдХреГрдд рдПрдореБрд▓реЗрдЯрд░ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯреЛрдХрди рдХреА рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП: рд╣рдо рдПрдХ рдкреВрд░реНрдг рдЕрдзрд┐рдХреГрдд рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реЗрд╡рд╛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ (рдЬрд╣рд╛рдВ рднреА рд╕рдВрднрд╡ рд╣реЛ) рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЕрдм рдХреБрдЫ рд╣рд▓реНрдХреЗ рд╡рдЬрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреИрд╕реЗ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

@samtstern рдпрд╣ рд╕реБрдирдХрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ (рдХрд╕реНрдЯрдо рджрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдПрдХреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдХреНрдпрд╛ рдХрд╣реАрдВ рднреА рд╣рдо рдкреНрд░рдЧрддрд┐/рдИрдЯреАрдП рдХреЗ рд╕рд╛рде рдмрдиреЗ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ?

@fandy рдирд╣реАрдВ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ ...

рдзрдиреНрдпрд╡рд╛рдж рд╕реИрдо, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ
рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдореЙрдХ рдХреЗ рдмрд┐рдирд╛ e2e рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд╛рдпрдХ

рдмреБрдзрд╡рд╛рд░, 26 рдЕрдЧрд╕реНрдд 2020 рдХреЛ 14:32 рдмрдЬреЗ, рд╕реИрдо рд╕реНрдЯрд░реНрди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

>
>

@fandy https://github.com/fandy рдирд╣реАрдВ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ
рдЕрднреА рддрдХ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ ...

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-680850282 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AABU35UAQDBYEXKKINJSM43SCT6E7ANCNFSM4I27PTFA
.

--

рд╕рдзрдиреНрдпрд╡рд╛рдж

рдирд┐рдХреЛрд╕ рдХрдЯреНрд╕рд┐рдХрд╛рдирд┐рд╕реЛ

рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ @firebase/testing рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХрд░рддрд╛ рд╣реИ: рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдереЛрдбрд╝рд╛ рд╕рдВрдкрд╛рджрд┐рдд рдЦрдВрдб рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @ рдлрд╛рдпрд░рдмреЗрд╕/рдкрд░реАрдХреНрд╖рдг рд╕реНрд░реЛрдд рдХреЛ рдореИрдиреЗрдЬ рдХрд░реЗрдВ:

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

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдЕрдм рдЬрдм рдореИрдВ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдирдХрд▓реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ рдЬреЛ рдПрдореБрд▓реЗрдЯрд░ рд╕реЛрдЪрддрд╛ рд╣реИ "рдкрд░реАрдХреНрд╖рдХ" рд╣реИ (рдЬреИрд╕реЗ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдо рдкрд░реАрдХреНрд╖рдг рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ)ред

рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдЬреЛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рдЖрдкрдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рд░реЛрдХрдирд╛ (рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдирдХрд▓реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрджрд╛рд╣рд░рдг:

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 })

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╕рд╣рд╛рдпрддрд╛ рдорд┐рд▓реЗрдЧреАтАж

рдпрджрд┐ рдЖрдк рдЗрд╕ рдереНрд░реЗрдб рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рдЕрд▓реНрдлрд╛ рдЯреЗрд╕реНрдЯрд░ рдмрдирдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рддреЛ рдЗрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ:

  1. рдлрд╛рдпрд░рдмреЗрд╕ рдЕрд▓реНрдлрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЕрдк рдХрд░реЗрдВ: https://services.google.com/fb/forms/firebasealphaprogram/
  2. рдореБрдЭреЗ [email protected] рдкрд░ рдПрдХ рдИрдореЗрд▓ рднреЗрдЬреЗрдВ, рдЗрд╕реЗ рдЙрд╕ рдИрдореЗрд▓ рдкрддреЗ рд╕реЗ рднреЗрдЬрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рддрднреА рдХрд░реЗрдВ рдЬрдм рдЖрдк рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдХреЗ рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ! рдмрдЧ рд╣реЛрдВрдЧреЗ рдФрд░ рд╕реЗрдЯрдЕрдк рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдХрдард┐рди рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВред

@samtstern рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ! рдореИрдВ рдЗрд╕реЗ рдЖрдЬрдорд╛рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рддрдХ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдбрдХреНрд╢рди рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕рдордп рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдирд╣реАрдВ рдЙрдард╛ рд╕рдХрддрд╛ред рдореИрдВ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рдЕрд▓реНрдлрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЕрдк рдХрд░реВрдВрдЧрд╛ :) рдорд╣рд╛рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

100% рдЗрд╕реЗ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ! рдЖрдкрдХрд╛ рдЖрджрдореА рд╕реИрдо!

@samtstern рдЗрд╕реЗ рдЖрдЬрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реИ рдФрд░ рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЙрд╕рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ!

рдореБрдЭреЗ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реИ

рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ, рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдПрдореБрд▓реЗрдЯрд░ рддрд╛рдЬрд╛ 8.14.0 рд░рд┐рд▓реАрдЬ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ! рдореИрдВ

рдХрдбрд╝реА рдореЗрд╣рдирдд рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрддреЛрдВ рдФрд░ @samtstern

рдмрдврд╝рд┐рдпрд╛ рд▓реЛрдЧ!

рдореИрдВ рд╕рд┐рд░реНрдл рджреВрдд рд╣реВрдБ! рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдПрдореБрд▓реЗрдЯрд░ 99% рдерд╛ ... рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕реЗ рдЬрд╛рдЧрдиреЗ рдкрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рд╕рдореНрдорд╛рди рджреЗрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдЗрд╕ рдирдП рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ? (рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдЖрджрд┐)

PSрдЗрд╕ рдкрд░ рдХрдбрд╝реА рдореЗрд╣рдирдд рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╣рд░ рддрд░рд╣ рдХреА рдЕрдЪреНрдЫреА рдЪреАрдЬреЗрдВ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

@nicoburns рдмрд╣реБрдд рдЬрд▓реНрдж! рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдШреЛрд╖рдгрд╛, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝, рдФрд░ рд╡рд╣ рд╕рднреА рдЕрдЪреНрдЫреА рдЪреАрдЬрд╝реЗрдВ рдмрд╣реБрдд рдЬрд▓реНрдж рдЖ рд░рд╣реА рд╣реИрдВред

рдмрдврд╝рд┐рдпрд╛ рдЦрдмрд░! :) рдЗрд╕реЗ рдЖрдЬрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ :)

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рдмрд╕ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрддреЗ рд╣реИрдВ:

  • рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдПрдореБрд▓реЗрдЯрд░ рдЕрдм рдЙрдкрд▓рдмреНрдз рд╣реИред рдЖрдк рдЗрд╕реЗ рдлрд╛рдпрд░рдмреЗрд╕ рд╕реАрдПрд▓рдЖрдИ>= v8.14.0 рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рдРрдкреНрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ ред
  • рдЗрд╕ рддрд░рд╣ рдХреА рд░реЛрдорд╛рдВрдЪрдХ рдШреЛрд╖рдгрд╛рдУрдВ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдЕрднреА рдлрд╛рдпрд░рдмреЗрд╕ рд╕рдорд┐рдЯ рд▓рд╛рдЗрд╡рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЯреНрдпреВрди рдХрд░реЗрдВред**

**рдмреЗрд╢рд░реНрдо рдкреНрд▓рдЧ: рдореИрдВ рдЖрдЬ рдмрд╛рдж рдореЗрдВ "рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдПрдореБрд▓реЗрдЯрд░ рд╕реВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдЖрдИ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВ" рдкрд░ рдПрдХ рд╕рддреНрд░ рднреА рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд┐ рд╕рддреНрд░ рдЕрдиреБрд╕реВрдЪреА рдкрд░ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


_рдкреА.рдПрд╕. рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 99% рдХреНрд░реЗрдбрд┐рдЯ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдПрдореБрд▓реЗрдЯрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯреАрдо рд╡рд░реНрдХ рд╣реИред рдлрд╛рдпрд░рдмреЗрд╕ рдФрд░ рдлрд╛рдпрд░рдмреЗрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ (рдЖрдк) рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕рдореЗрдВ рднреА рдмрдбрд╝реА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдИред рд╢реБрдХреНрд░рд┐рдпрд╛!_

@yuchenshi рдХреНрдпрд╛

@vdjurdjevic рдЕрднреА рдирд╣реАрдВ, рд╣рдо рдЙрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдореБрджреНрджрд╛ рд╣реИ рдФрд░ рд╣рд░ рдЕрдкрдбреЗрдЯ 50-100 рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдЕрдм рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдПрдореБрд▓реЗрдЯрд░ рдЬрд╛рд░реА рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдкрдбреЗрдЯ рд╕реЗ рд▓реЙрдХ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдкреНрд░рд╢реНрди, рдмрдЧ рдпрд╛ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рд╢реБрд░реВ рдХрд░реЗрдВ!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

ahmadalibaloch picture ahmadalibaloch  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hmazter picture hmazter  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nareshbhatia picture nareshbhatia  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chwzr picture chwzr  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

DragonOsman picture DragonOsman  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ