コピペで使うFirebase【Authentication編】 

# 概要
Authentication(認証)を使う際にコピペで動かしたいのでそのまとめです。

公式ドキュメント
[認証](https://firebase.google.com/docs/auth/?hl=ja)

Firebase SDK Auth
　・[初期設定 FirebaseSDK](#初期設定-firebasesdk)
　・[ユーザー登録](#ユーザー登録)
　・[ログイン](#ログイン)
　・[ユーザーデータ取得](#ユーザーデータ取得)
　・[ログアウト](#ログアウト)

Admin SDK
　・[初期設定 AdminSDK](#初期設定-adminsdk)
　・[ユーザー取得](#ユーザー取得)
　・[ユーザー作成](#ユーザー作成)
　・[ユーザー更新](#ユーザー更新)
　・[ユーザー削除](#ユーザー削除)

# Firebase SDK Auth
client側
## 初期設定 FirebaseSDK
インストール

```bash
$ npm install firebase --save
```

firebase初期化

```js
import firebase from "firebase/app";
import "firebase/auth";

const firebaseConfig = {
    /* firebase config */
}

// 初期化は一度だけ
if (!firebase.apps.length) {
    firebase.initializeApp(firebaseConfig);
}
```

## ユーザー登録
ユーザーをEmailとpasswordを用いて新規に作成する
**Firebaseコンソール > [Authentication] > [ログイン方法] で事前に設定する必要がある**

```js
firebase.auth().createUserWithEmailAndPassword(email, password)
```

## ログイン
多くの方法でのログインが提供されている
**Firebaseコンソール > [Authentication] > [ログイン方法] で事前に設定する必要がある**
※よく使われるものだけ抜粋

### メールアドレスとパスワードを使用してログイン
```js
firebase.auth().signInWithEmailAndPassword(email, password)
```

### Google ログイン
```js
const provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithPopup(provider).then(result => /* ... */);
```

### Facebook ログイン
```js
const provider = new firebase.auth.FacebookAuthProvider();
firebase.auth().signInWithPopup(provider).then(result => /* ... */);
```

### Twitter ログイン
```js
const provider = new firebase.auth.TwitterAuthProvider();
firebase.auth().signInWithPopup(provider).then(result => /* ... */);
```

### 匿名認証
```js
firebase.auth().signInAnonymously();
```

匿名認証後に各プロバイダーで匿名認証のUIDを引き継ぎたい場合
・例： 匿名認証済みで、googleログインしたアカウントへUIDを引き継ぎたい場合

```js
const provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().currentUser.linkWithPopup(provider).then(result => /* ... */);
```

### ログアウト

```js
firebase.auth().signOut()
```

## ユーザーデータ取得
ユーザーのログイン状態が変わるたびにユーザーデータを取得する

```js
firebase.auth().onAuthStateChanged(user => /* ... */)
```

# Admin SDK
backend側
## 初期設定 AdminSDK
インストール

```bash
$ npm install firebase-admin --save
```

```js
var admin = require('firebase-admin');

// 初期化
admin.initializeApp({
    credential: XXXX,
    databaseURL: XXXX
});
```

## ユーザー取得
・uidでユーザーを取得

```js
admin.auth().getUser(uid).then(function(userRecord) { /* ... */ })
```

・Emailでユーザーを取得

```js
admin.auth().getUserByEmail(email).then(function(userRecord) { /* ... */ })
```

・電話番号でユーザーを取得

```js
admin.auth().getUserByPhoneNumber(phoneNumber).then(function(userRecord) { /* ... */ })
```

## ユーザー作成
**プロパティーを指定しない場合は、その値は空となる**

```js
var user = {
    uid: /** 指定しなければ自動で生成される **/,
    email: /** Emailアドレス **/,
    emailVerified: false /** boolean Emailアドレスの確認の有無 **/,
    phoneNumber: '+11234567890' /** 電話番号 **/,
    password: /** パスワード **/,
    displayName: /** ユーザーの表示名 **/,
    photoURL: /** ユーザーの写真 URL **/,
    disabled: false /** ユーザーが無効かどうか **/
};

admin.auth().createUser(user).then(function(userRecord) { /* ... */ })
```

## ユーザー更新
uidでユーザーを指定しデータを更新する
**プロパティーを指定しない場合は、その値は更新されない**

```js
var user = {
  email: /** Emailアドレス **/,
  phoneNumber: '+11234567890' /** 電話番号 **/,
  emailVerified: false /** boolean Emailアドレスの確認の有無 **/,
  password: /** パスワード **/,
  displayName: /** ユーザーの表示名 **/,
  photoURL: /** ユーザーの写真 URL **/,
  disabled: false /** ユーザーが無効かどうか **/
}

admin.auth().updateUser(uid, user).then(function(userRecord) { /* ... */ })
```

## ユーザー削除
uidでユーザーを指定しユーザーを削除する

```js
admin.auth().deleteUser(uid).then(function() { /* ... */ })
```