Firebase v9, TypeScript 및 예를 사용하여 인증에 반응하십시오.
53908 단어 beginnerstypescriptfirebasereact
Firebase를 사용하여 로그인 양식을 빌드하고 인증하고 반응하는 방법에 대한 단계별 가이드입니다. 나는 그것을 몇 번 해왔고 처음 그것을했을 때 어려움을 겪었던 경험을 공유하고 싶습니다.
따라서 Firebase 사용 방법을 모른다면 그들은 정말 좋은 문서를 가지고 있지만 먼저 웹 사이트로 이동하여 계정을 만드십시오. 단계를 보여 드리겠습니다...
계정을 생성하면 콘솔로 이동하여 아래 그림과 같이 새 프로젝트를 생성할 수 있습니다.
프로젝트 이름과 여기에서 요청하는 나머지 세부 정보를 입력합니다.
그런 다음 '앱에 Firebase를 추가하여 시작하기' 하위 헤더 아래 오른쪽에서 웹() 기호인 세 번째 아이콘을 클릭합니다.
다음을 확인해야 합니다.
표시되는 것은 firebase와 연결하기 위해 반응 앱에서 사용할 키입니다.
아래와 같이 프로젝트 설정을 클릭하면 언제든지 해당 키에 액세스할 수 있습니다.
프로젝트에서
email/password
에 대한 이메일 및 비밀번호 인증을 활성화해야 합니다.나는 당신이 반응 앱을 만드는 방법을 알고 있다고 가정하지만 그렇지 않은 경우 설명서here를 확인할 수 있지만 TypeScript가 설치되어 있는지 확인하십시오.
그런 다음 Firebase 문서를 기반으로 프로젝트를 연결하고 연결해야 합니다. 먼저 프로젝트의 루트에
.env
파일을 만들고 해당 변수를 추가해야 합니다.각 값은 위의 그림에서 보는 값에 해당합니다.
REACT_APP_FIREBASE_API_KEY=" "
REACT_APP_FIREBASE_PROJECT_ID=""
REACT_APP_FIREBASE_AUTH_DOMAIN=""
REACT_APP_FIREBASE_APP_ID=""
REACT_APP_FIREBASE_MESSAGING_SENDER_ID=""
REACT_APP_FIREBASE_STORAGE_BUCKET=""
이 앱에는 firebase v9를 사용하고 있습니다.
이제 반응 앱에서 Firebase SDK를 설치하고 로그인해야 합니다. 컴퓨터에 firebase 및 firebase 도구를 설치합니다. 그런 다음 firebase -init로 앱을 초기화하고 문서의 지침을 따르면 클라우드에 있는 프로젝트를 매우 간단하고 간단하게 초기화할 수 있습니다. 그런 다음 firebase 로그인을 시도하고 시도하면 리디렉션되어야 하며 연결되었음을 의미합니다.
이 작업이 완료되면
firebase.ts
파일을 생성합니다.mport { initializeApp } from 'firebase/app'
import { getAuth } from 'firebase/auth'
const FIREBASE_CONFIG = {
apiKey: process.env.REACT_APP_FIREBASE_API_KEY,
appId: process.env.REACT_APP_FIREBASE_ID,
authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,
messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,
projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
}
const firebaseApp = initializeApp(FIREBASE_CONFIG)
export const auth = getAuth(firebaseApp)
그런 다음 AuthProvider 파일 Authprovider.ts를 만듭니다.
import React, {
ReactNode,
useEffect,
useState,
useContext,
createContext,
} from 'react'
import { auth } from '../config/firebase'
import {
Auth,
UserCredential,
User,
createUserWithEmailAndPassword,
signInWithEmailAndPassword,
sendPasswordResetEmail,
} from 'firebase/auth'
export interface AuthProviderProps {
children?: ReactNode
}
export interface UserContextState {
isAuthenticated: boolean
isLoading: boolean
id?: string
}
export const UserStateContext = createContext<UserContextState>(
{} as UserContextState,
)
export interface AuthContextModel {
auth: Auth
user: User | null
signIn: (email: string, password: string) => Promise<UserCredential>
signUp: (email: string, password: string) => Promise<UserCredential>
sendPasswordResetEmail?: (email: string) => Promise<void>
}
export const AuthContext = React.createContext<AuthContextModel>(
{} as AuthContextModel,
)
export function useAuth(): AuthContextModel {
return useContext(AuthContext)
}
export const AuthProvider = ({ children }: AuthProviderProps): JSX.Element => {
const [user, setUser] = useState<User | null>(null)
function signUp(email: string, password: string): Promise<UserCredential> {
return createUserWithEmailAndPassword(auth, email, password)
}
function signIn(email: string, password: string): Promise<UserCredential> {
return signInWithEmailAndPassword(auth, email, password)
}
function resetPassword(email: string): Promise<void> {
return sendPasswordResetEmail(auth, email)
}
useEffect(() => {
//function that firebase notifies you if a user is set
const unsubsrcibe = auth.onAuthStateChanged((user) => {
setUser(user)
})
return unsubsrcibe
}, [])
const values = {
signUp,
user,
signIn,
resetPassword,
auth,
}
return <AuthContext.Provider value={values}>{children}</AuthContext.Provider>
}
export const useUserContext = (): UserContextState => {
return useContext(UserStateContext)
그런 다음 방금 만든 공급자로 App.tsx를 다음과 같이 래핑해야 합니다.
function App(): JSX.Element {
return (
<div className="App">
<QueryClientProvider client={queryClient}>
<AuthProvider>
..........
.......
<AuthProvider/>
이제 signUp.tsx 파일이 있습니다.
메모:
양식의 경우 Yup 및 다음과 같은 사용자 정의 양식을 사용하고 있습니다.
FormGroup
또는 FormActions
. 여기에서 파일을 찾을 수 있습니다.https://codesandbox.io/s/form-yup-typescript-e7yum
import React, { useState } from 'react'
import { Input, ThemeUIStyleObject, Grid, Button, Text, Alert } from 'theme-ui'
import { Form, Formik } from 'formik'
import * as Yup from 'yup'
import { useHistory } from 'react-router-dom'
import { FormGroup } from '../FormGroup/FormGroup'
import { DASHBOARD_PAGE_PATH, SIGN_IN_PAGE_PATH } from '../../config/paths'
import { useAuth } from '../../providers/AuthProvider'
import { passwordValidation } from '../../utils/passwordValidation/passwordValidation'
import { FormWrapper } from '../FormWrapper/FormWrapper'
import { Link } from 'react-router-dom'
interface SignUpFormValues {
email: string
password: string
repeatPassword: string
}
const SignUpSchema = Yup.object().shape({
email: Yup.string().email('Invalid email').required('Required'),
password: passwordValidation,
repeatPassword: Yup.string().when('password', {
is: (val: string) => val && val.length > 0,
then: Yup.string()
.oneOf([Yup.ref('password')], 'Both passwords need to be the same')
.required('Required'),
}),
})
export interface SignUpProps {
sx?: ThemeUIStyleObject
}
const SignUp = ({ sx }: SignUpProps): JSX.Element => {
const { signUp } = useAuth()
const [formError, setFormError] = useState<string>('')
const [formSubmitting, setFormSubmitting] = useState<boolean>(false)
const history = useHistory()
return (
<FormWrapper title="Create account" sx={{ ...sx }}>
<Formik
initialValues={{
email: '',
password: '',
repeatPassword: '',
}}
onSubmit={async (values: SignUpFormValues) => {
setFormSubmitting(true)
try {
await signUp(values.email, values.password)
try {
history.push(DASHBOARD_PAGE_PATH)
} catch (error) {
console.log(`🚀 ~ signup error`, error)
}
} catch (error) {
console.log(error)
setFormError(formError)
setFormSubmitting(false)
}
}}
validationSchema={SignUpSchema}
>
{({ getFieldProps }) => (
<Form>
<FormGroup label="Email address" name="email">
<Input
sx={{ borderColor: 'rgb(209, 218, 230)' }}
{...getFieldProps('email')}
id="email"
/>
</FormGroup>
<FormGroup label="Password" name="password">
<Input
sx={{
borderColor: 'rgb(209, 218, 230)',
}}
{...getFieldProps('password')}
type="password"
id="password"
/>
</FormGroup>
<FormGroup label="Repeat password" name="repeatPassword">
<Input
sx={{
borderColor: 'rgb(209, 218, 230)',
}}
{...getFieldProps('repeatPassword')}
type="password"
id="repeatPassword"
/>
</FormGroup>
<Grid>
<Button type="submit" sx={{ mt: 1 }} variant="buttons.primary">
Sign up
</Button>
<Link to={{ pathname: SIGN_IN_PAGE_PATH }}>
<Text
sx={{
display: 'inline-block',
textDecoration: 'none',
textAlign: 'center',
margin: '0 auto',
fontSize: 2,
color: 'brand',
}}
>
Do you already have an account? Please login in here.
</Text>
</Link>
</Grid>
{formError && <Alert variant="error">{formError}</Alert>}
</Form>
)}
</Formik>
</FormWrapper>
)
}
export default SignUp
이제 로그인 구성 요소에서:
나는 Formik을 사용하고 있습니다. 기능이 준비되어 있고 코드를 덜 작성하기 때문입니다. 여기에서 확인할 수 있습니다.
import React, { useState } from 'react'
import { Input, Button, Grid, Text, ThemeUIStyleObject, Alert } from 'theme-ui'
import { Link } from 'react-router-dom'
import { useHistory } from 'react-router-dom'
import { Form, Formik, ErrorMessage } from 'formik'
import * as Yup from 'yup'
import { DASHBOARD_PAGE_PATH, SIGN_UP_PAGE_PATH } from '../../config/paths'
import { useAuth } from '../../providers/AuthProvider'
import { FormGroup } from '../../components/FormGroup/FormGroup'
import { FormWrapper } from '../FormWrapper/FormWrapper'
export interface SignInProps {
sx?: ThemeUIStyleObject
}
interface SignInFormValues {
email: string
password: string
}
const SignInSchema = Yup.object().shape({
email: Yup.string().email('Invalid email').required('Required'),
password: Yup.string().required('Required').min(8).max(200),
})
export const SignIn = ({ sx }: SignInProps): JSX.Element => {
const { signIn } = useAuth()
const [formSubmitting, setFormSubmitting] = useState<boolean>(false)
const [formError, setFormError] = useState<string>('')
const history = useHistory()
return (
<FormWrapper title="Welcome back" sx={{ ...sx }}>
<Formik
initialValues={{
email: '',
password: '',
}}
onSubmit={async (values: SignInFormValues) => {
setFormSubmitting(true)
try {
await signIn(values.email, values.password)
history.push(DASHBOARD_PAGE_PATH)
} catch (error: unknown) {
let errorMessage = 'error.unknown'
if (typeof error === 'string') {
errorMessage = error.toUpperCase()
} else if (error instanceof Error) {
errorMessage = error.message
}
setFormError(errorMessage)
setFormSubmitting(false)
}
}}
validationSchema={SignInSchema}
>
{({ getFieldProps }) => (
<Form>
<FormGroup label="You email address" name="email">
<Input
sx={{ borderColor: 'rgb(209, 218, 230)' }}
{...getFieldProps('email')}
id="email"
/>
</FormGroup>
<FormGroup label="Password" name="password">
<Input
sx={{ width: '400px', borderColor: 'rgb(209, 218, 230)' }}
{...getFieldProps('password')}
type="password"
id="password"
/>
</FormGroup>
<Grid>
<Button type="submit" sx={{ mt: 1 }} variant="buttons.primary">
Log in
</Button>
<Link to={SIGN_UP_PAGE_PATH}>
<Text
sx={{
display: 'inline-block',
color: 'brand',
textDecoration: 'none',
fontSize: 2,
}}
>
Dont have an account? Please Sign up here.
</Text>
</Link>
</Grid>
<br />
{formError && <Alert variant="error">{formError}</Alert>}
</Form>
)}
</Formik>
</FormWrapper>
)
}
이제 콘솔에서 생성된 이메일 및 Firebase 토큰의
Authentication
탭에 표시되어야 합니다.
Reference
이 문제에 관하여(Firebase v9, TypeScript 및 예를 사용하여 인증에 반응하십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vikirobles/react-authentication-with-firebase-v9-typescript-and-yup-4025텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)