質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Firebase Authentication

Firebase Authenticationは、Firebaseを利用したユーザーの認証機能です。バックエンドサービス、SDK、アプリでのユーザー認証に使用できるUIライブラリが用意されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1213閲覧

Firebase AuthenticationでReactアプリに認証機能を作っており、provider.tsファイルについてエラーが出て動かない。

退会済みユーザー

退会済みユーザー

総合スコア0

Firebase Authentication

Firebase Authenticationは、Firebaseを利用したユーザーの認証機能です。バックエンドサービス、SDK、アプリでのユーザー認証に使用できるUIライブラリが用意されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/09/13 14:36

編集2020/09/13 15:11

こんにちは!
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ファイルのエラーです。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

初めてReactを触ってみたが、ログイン周りの決定打が見つからなかったので自分で書いてみた。
上記のサイトを参考に、Firebaseの利用は諦めて、Reactだけで実装してみました。無事、ログインはできました。

投稿2020/09/14 10:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問