こんにちは!
Reactアプリに認証機能を付けたくて、Firebase Authenticationを使っています。
【React】 Firebaseを使用して認証機能の実装
上記サイトを見ながら、認証機能を付けているのですが、うまく動作しません。
どのように対処したら良いのでしょうか、ご教授頂ければと思います。
また、他に良い実装方法があれば、教えて頂けると大変嬉しいです。
よろしくお願い致します。
出ているエラー
FirebaseのコンソールでもAPI Keyを見直してみましたが、全く同じでしたので、打ち間違えてはいないようでした。
また、TypeScriptでは記述しておらず、エラーに出てくるprovider.tsファイルは自分が作ったファイルではありません。
私のコード
App.jsファイル
JavaScript
1import React from 'react'; 2import './App.css'; 3import { BrowserRouter as Router, Route } from 'react-router-dom'; 4import PrivateRoute from './PrivateRoute'; 5import { AuthProvider } from './auth'; 6import Login from './Login'; 7import SignUp from './SignUp'; 8import Home from './components/Home'; 9 10const App = () => { 11 return ( 12 <AuthProvider> 13 <Router> 14 <div> 15 <PrivateRoute exact path='/' component={ Home } /> 16 <Route exact path='/login' component={ Login } /> 17 <Route exact path='/signup' component={ SignUp } /> 18 </div> 19 </Router> 20 </AuthProvider> 21 ) 22} 23 24export default App;
PrivateRoute.jsファイル
JavaScript
1import React, { useContext } from 'react'; 2import { Route } from 'react-router-dom'; 3import { AuthContext } from './auth'; 4import Login from './Login'; 5 6const PrivateRoute = ({ component: RouteComponent, ...options }) => { 7 const { currentUser } = useContext(AuthContext); 8 const Component = currentUser ? RouteComponent : Login; 9 return ( 10 <Route { ...options } component={ Component } /> 11 ); 12}; 13 14export default PrivateRoute;
auth.jsファイル
JavaScript
1import React, { useEffect, useState } from 'react'; 2import { app } from './base.js'; 3 4// contextの作成 5export const AuthContext = React.createContext(); 6 7export const AuthProvider = ({ children }) => { 8 const [currentUser, setCurrentUser] = useState(null); 9 // const [pending, setPending] = useState(true); 10 11 // loginさせる関数 12 const login = async(email, password, history) => { 13 try { 14 await app.auth().signInWithEmailAndPassword(email, password); 15 history.push('/'); 16 } catch(error) { 17 alert(error); 18 } 19 }; 20 21 // signUpさせる関数 22 const signup = async (email, password, history) => { 23 try { 24 await app.auth().createUserWithEmailAndPassword(email, password); 25 history.push("/"); 26 } catch (error) { 27 alert(error); 28 } 29 }; 30 31 useEffect(() => { 32 app.auth().onAuthStateChanged(setCurrentUser); 33 }, []); 34 35 return ( 36 <AuthContext.Provider 37 value={{ 38 login: login, 39 signup: signup, 40 currentUser 41 }} 42 > 43 { children } 44 </AuthContext.Provider> 45 ); 46 /*useEffect(() => { 47 app.auth().onAuthStateChanged((user) => { 48 setCurrentUser(user); 49 setPending(false); 50 }); 51 }, []); 52 53 if (pending) { 54 return <>Loading...</> 55 } 56 57 return ( 58 <AuthContext.Provider 59 value={{ currentUser }} 60 > 61 { children } 62 </AuthContext.Provider> 63 );*/ 64};
Login.jsファイル
JavaScript
1import React, { useContext } from 'react'; 2import { withRouter } from "react-router"; 3import { AuthContext } from "./auth"; 4 5const Login = ({ history }) => { 6 const { login } = useContext(AuthContext); 7 8 // AuthContextからlogin関数を受け取る 9 const handleSubmit = event => { 10 event.preventDefault(); 11 const { email, password } = event.target.elements; 12 login(email.value, password.value, history); 13 }; 14 15 return ( 16 <div> 17 <h1>Log in</h1> 18 <form onSubmit={handleSubmit}> 19 <label> 20 Email 21 <input name="email" type="email" placeholder="Email" /> 22 </label> 23 <label> 24 Password 25 <input name="password" type="password" placeholder="Password" /> 26 </label> 27 <button type="submit">Log in</button> 28 </form> 29 </div> 30 ); 31}; 32 33export default withRouter(Login);
SignUp.jsファイル
JavaScript
1import React, { useContext } from "react"; 2import { withRouter } from "react-router"; 3import { AuthContext } from "./auth"; 4 5const SignUp = ({ history }) => { 6 const { signup } = useContext(AuthContext); 7 // AuthContextからsignup関数を受け取る 8 const handleSubmit = event => { 9 event.preventDefault(); 10 const { email, password } = event.target.elements; 11 signup(email.value, password.value, history); 12 }; 13 14 return ( 15 <div> 16 <h1>Sign up</h1> 17 <form onSubmit={handleSubmit}> 18 <label> 19 Email 20 <input name="email" type="email" placeholder="Email" /> 21 </label> 22 <label> 23 Password 24 <input name="password" type="password" placeholder="Password" /> 25 </label> 26 <button type="submit">Sign Up</button> 27 </form> 28 </div> 29 ); 30}; 31 32export default withRouter(SignUp);
Home.jsファイル
JavaScript
1import React from 'react'; 2import { app } from '../base'; 3 4function Home(props) { 5 return ( 6 <div> 7 <h2>Home Page</h2> 8 {/* ログアウトさせる */} 9 <button onClick={() => app.auth().signOut()}>Sign Out</button> 10 </div> 11 ); 12} 13 14export default Home;
index.jsファイル
JavaScript
1import React from 'react'; 2import ReactDOM from 'react-dom'; 3import './index.css'; 4import App from './App'; 5import * as serviceWorker from './serviceWorker'; 6 7ReactDOM.render( 8 <App />, 9 document.getElementById('root') 10); 11 12// If you want your app to work offline and load faster, you can change 13// unregister() to register() below. Note this comes with some pitfalls. 14// Learn more about service workers: https://bit.ly/CRA-PWA 15serviceWorker.unregister();
ファイル構成
補足
.envファイルのファイル名を、credentials.envから、.envに変更してみましたが、
以下のエラーになりました。同じく、provider.tsファイルのエラーです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。