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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

React.js

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

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

Q&A

解決済

1回答

2247閲覧

[React] FirebaseのGoogle認証でなんどもリダイレクトされてしまう原因がわからない

DaisukeMori

総合スコア226

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

React.js

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

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

0グッド

1クリップ

投稿2020/05/12 14:49

編集2020/05/12 14:52

前提

  • ReactはFunctionコンポーネントで記述

※classコンポーネントは利用しない

  • Googleアカウント認証

問題

公式ドキュメント5番「ログインページにリダイレクトしてログインを行う場合」

現在ReactとFirebaseを利用してGoogleアカウントの自動認証・ログインする仕組みを構築中なのですが、コンポーネントページ(src/auth/GoogleAuth.js)に遷移した際、リダイレクトが延々にループしてしまいます。
延々とリダイレクトループしてはサービスとしてよろしくありません。
なぜこのようなことがおこるのか、原因不明です。

ただ、試しに、ルートアドレスである「http://localhost:3000/」をURLにペーストすると
認証ページに遷移して、FirebaseのAuthenticationに登録・ログインはできています。

cf. Firebase Google認証公式ドキュメント
【Firebase公式】JavaScript で Google ログインを使用して認証する

js

1// src/auth/GoogleAuth.js 2 3import React from 'react'; 4import { Link } from 'react-router-dom'; 5import firebase from '../Firebase'; 6 7const GoogleAuth = () => { 8 // ログインページにリダイレクトしてログインを行う場合の処理 9 const provider = new firebase.auth.GoogleAuthProvider(); 10 11 firebase.auth().signInWithRedirect(provider); 12 13 firebase.auth().getRedirectResult().then(function(result) { 14 if (result.credential) { 15 const token = result.credential.accessToken; 16 console.log(token); 17 } 18 const user = result.user; 19 console.log(user); 20 }).catch(function(error) { 21 const errorCode = error.code; 22 const errorMessage = error.message; 23 const email = error.email; 24 const credential = error.credential; 25 console.log(errorCode); 26 console.log(errorMessage); 27 console.log(email); 28 console.log(credential); 29 }); 30 31 return ( 32 <React.Fragment> 33 <h2>Google Auth</h2> 34 <p>認証完了しました</p> 35 <Link to="/">Home</Link> 36 </React.Fragment> 37 ); 38} 39 40export default GoogleAuth;

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

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

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

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

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

guest

回答1

0

自己解決

ReactはSPAなので、本来はGoogleAuthページは存在していなくて、
JSのルーティングによって表示するべきページを
リダイレクトしてしまったことで、うまく処理が通らずリダイレクトループに陥ってたようです。

実際にWebにデプロイするとGoogleAuthページはNot Foundと出ていました。

なので、GoogleAuthへ遷移するのではなく
SigninページにてonClickイベントで関数を走らせると
無事にGoogole認証&ログインできました。

うまくいったコードを実際のコードアップしておきます。

js

1// src/auth/Signin.js 2import React, { useContext } from 'react'; 3import { Link } from 'react-router-dom'; 4import { withRouter } from 'react-router'; 5import { AuthContext } from './AuthProvider'; 6 7// Google認証の関数インポート 8import GoogleAuth from './GoogleAuth'; 9 10const Signin = ({ history }) => { 11 const { signin } = useContext(AuthContext); 12 13 const handleSubmit = (e) => { 14 e.preventDefault(); 15 const { email, password } = e.target.elements; 16 signin(email.value, password.value, history); 17 } 18 19 return ( 20 <React.Fragment> 21 <h2>Sign in</h2> 22 <form onSubmit={ handleSubmit }> 23 <Link to="/signup">Sign up</Link> 24 <input name="email" type="email" placeholder="Email" /> 25 <input name="password" type="password" placeholder="Password" /> 26 <button type="submit">Sign in</button> 27 </form> 28 29 {/* onClickイベント */} 30 <button onClick={ GoogleAuth }>Google認証</button> 31 </React.Fragment> 32 ); 33} 34 35export default withRouter(Signin);

js

1// src/auth/GoogleAuth.js 2import firebase from '../Firebase'; 3 4// Google認証する関数のみ 5const GoogleAuth = (e) => { 6 e.preventDefault(); 7 const provider = new firebase.auth.GoogleAuthProvider(); 8 9 firebase.auth().signInWithRedirect(provider); 10 11 firebase.auth().getRedirectResult().then(function(result) { 12 if (result.credential) { 13 const token = result.credential.accessToken; 14 console.log(token); 15 } 16 const user = result.user; 17 console.log(user); 18 }).catch(function(error) { 19 const errorCode = error.code; 20 const errorMessage = error.message; 21 22 const email = error.email; 23 const credential = error.credential; 24 console.log(errorCode); 25 console.log(errorMessage); 26 console.log(email); 27 console.log(credential); 28 }); 29} 30 31export default GoogleAuth;

投稿2020/05/13 12:16

DaisukeMori

総合スコア226

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問