初心者がReact+FirebaseでWebアプリを作成する③　～Firebase Authenticationの認証機能を使ってみた～ 

②の続きです。

今回はfirebaseの認証機能を使って、ログインしたユーザーがだけが書き込みをできるようにします。

↓のGitHubのページを参考にしました。
https://github.com/firebase/firebaseui-web-react

その他参考。
https://firebase.google.com/docs/auth/web/manage-users?hl=ja
https://firebase.google.com/docs/auth/web/start?hl=ja

まずはfirebaseのAuthenticathionのログイン方法でGoogleとメール／パスワード認証を有効にしてみましょう。
TwitterなどはAPIを申請をしなければならないので無効にしています。
![authentication.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520057/ab32e384-1f38-035c-df9f-420487215faf.png)

以下のnpmコマンドを実行。

######npm install --save react-firebaseui
######npm install --save firebase


firebase-uiがインストールできたら↓のように変数uiConfigを定義して、
StyledFirebaseAuthで呼び出すようにします。

```Javascript:App.js
    const uiConfig = {
　　　//認証するときポップアップします
      signInFlow: 'popup',

　　　//サインインしたときのリンク先
      signInSuccessUrl: '/',

      //認証方法一覧。
      //Googleの部分をFacebook、Twitter等に変えれば、そのAPIが使用できます
      signInOptions: [
        firebase.auth.GoogleAuthProvider.PROVIDER_ID,
        firebase.auth.EmailAuthProvider.PROVIDER_ID,
      ]
    };
```

今回は以下のようにまとめました。
stateにisLoginを設けて、true、falseでログイン状態を管理しています。
コンポーネント化していないので散らかっていますが、後ほどまとめていきます。

```Javascript:App.js
import React from 'react';
import './App.css';
import firebase from "firebase/app"
import "firebase/auth"
import "firebase/firestore"

//①でモジュール化したfirebase.jsをインポート
import { firestore } from './plugins/firebase';

import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';
import TextareaAutosize from '@material-ui/core/TextareaAutosize';
import StyledFirebaseAuth from 'react-firebaseui/StyledFirebaseAuth';


class App extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      name: '',
      address: '',
      isLogin: false,
    }    
    this.getName = this.getName.bind(this);
    this.getAddress = this.getAddress.bind(this);
    this.addData = this.addData.bind(this);
    this.logOut = this.logOut.bind(this);
  }

  //コンポーネント配置時にログインできてるか確認します
  componentDidMount() {
    firebase.auth().onAuthStateChanged(user => {
      this.setState({
        isLogin: true,
      });
    });
  }

　//名前の入力フォーム情報読み込み
  getName(event) {
    this.setState({
      name: event.target.value,
    });
  };

　//住所の入力フォーム情報読み込み
  getAddress(event) {
    this.setState({
      address: event.target.value,
    });
  };
  
　//登録ボタンを押すとデーターベースに反映
  addData(){ 
    firestore.collection('users').add({
    name: this.state.name,
    address: this.state.address,
    created_at: new Date(),
    }).then(() => {
    this.setState({
      name: '',
      address: '',
    });
  })};

　//ログアウトボタンを押すとisLoginがfalseになる
  logOut(){
    this.setState({
      isLogin: false,
    });
  }



  render(){
    const uiConfig = {
      signInFlow: 'popup',
      signInSuccessUrl: '/',
      signInOptions: [
        firebase.auth.GoogleAuthProvider.PROVIDER_ID,
        firebase.auth.EmailAuthProvider.PROVIDER_ID,
      ]
    };
　　
    //空の変数を定義してifでログイン／ログアウト時の表示画面を切り替える
    let successfulUser;

    if(this.state.isLogin){
      successfulUser=(
        <div>
        <form>
        <TextField  label="名前" 
         value= {this.state.name} 
         onChange={(event)=>{this.getName(event)}}/> 
         <br/>

         <TextareaAutosize 
         aria-label="住所" 
         rowsMax={4} 
         placeholder="住所" 
         value= {this.state.address} 
         onChange={(event)=>{this.getAddress(event)}}
         />;
         <br/>

        <Button variant="contained" color="primary" onClick={this.addData}>登録</Button>
        </form>
        <Button variant="contained" color="secondary" onClick={this.logOut}>ログアウト</Button> 
        </div>
      
      );
     }else{
      successfulUser=(
         <div>
         <p>Please sign-in:</p>
         <StyledFirebaseAuth uiConfig={uiConfig} firebaseAuth={firebase.auth()}/>
         </div>
       );
      }   

     return(
　　　　//最終的な表示画面
       <div>
          {successfulUser}   
       </div>
      );
    }
}
export default App;
```

するとログイン画面が表示されます。
![pleasesignin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520057/0637c869-9141-d3ac-c85b-a86f5fdfa0e1.png)

ログインできたら②で作った投稿画面へ切り替わります。
![successfuluser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520057/09d88fdf-80e3-7b94-37bb-8682089495b3.png)

これでログインしたユーザーだけが書き込みをできるようになりました。
ユーザー情報もちゃんと登録されています。
![ユーザー認証成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520057/eae8819d-42fe-e66a-a3a5-3f2abe50fce9.png)


componentDidMountについてはReactの公式ページが一番分かりやすかったです。
ライフサイクル図が秀逸だと思います。
↓
https://ja.reactjs.org/docs/react-component.html

それではまた投稿いたします。