---
# System prepended metadata

title: firebase
tags: [firebase]

---

---
tags: firebase,
disqus: hackmd
---

###### tags: `firebase`

# firebase

參考文章
[Day26 前端福音(1/4): Firebase-介紹 & 建立專案](https://ithelp.ithome.com.tw/articles/10205404)
[Day27 前端福音(2/4): Firebase-寫入&刪除資料](https://ithelp.ithome.com.tw/articles/10205765)
[Day28 前端福音(3/4): Firebase-讀取資料](https://ithelp.ithome.com.tw/articles/10205961)
[Day29 前端福音(4/4): Firebase-帳號系統&資料讀寫規則](https://ithelp.ithome.com.tw/articles/10206354)

[[教學] Firebase Hosting 免費1G/10G靜態網頁空間架設，與綁定網域名稱](https://www.minwt.com/website/server/21596.html)

[Firebase Cloud Firestore 基礎入門 Part.1 - 簡介](https://ithelp.ithome.com.tw/articles/10223256?sc=rss.iron)
[Firebase Cloud Firestore 基礎入門 Part.2 - 建置 Firebase 專案及資料庫](https://ithelp.ithome.com.tw/articles/10223615)

[在 Firebase 中管理用户](https://firebase.google.com/docs/auth/web/manage-users)

---

firebase代管 ==> Firebase Hosting

Cloud Firestore 資料的儲存位置 ==> 選擇離台灣比較近的 asia-east2

firestore要使用必須要有引入`firebase-firestore.js`

```javascript=
const db = firebase.firestore();
```

* 設定：set()
* 更新：update()
* 添加：add()
* 刪除：delete()

一個簡單的新增範例

```htmlmixed=
<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="https://www.gstatic.com/firebasejs/7.15.5/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.15.5/firebase-firestore.js"></script>

<!-- TODO: Add SDKs for Firebase products that you want to use
 https://firebase.google.com/docs/web/setup#available-libraries -->
<script src="https://www.gstatic.com/firebasejs/7.15.5/firebase-analytics.js"></script>

<!-- firebase的js必須放在所有js之前 -->
<script src="./index.js"></script>
```

```javascript=
// Your web app's Firebase configuration
const firebaseConfig = {
    apiKey: 'AIzaSyAncpQXcc6UAlllACYvqDzrpQnemgsDKbk',
    authDomain: 'member-database-fdf1e.firebaseapp.com',
    databaseURL: 'https://member-database-fdf1e.firebaseio.com',
    projectId: 'member-database-fdf1e',
    storageBucket: 'member-database-fdf1e.appspot.com',
    messagingSenderId: '398211092204',
    appId: '1:398211092204:web:e56a27f2a566c36e69dfc9',
    measurementId: 'G-19CNHH96GK'
};
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
firebase.analytics();

const db = firebase.firestore();

//新增會員資料
db.collection('users').add({
    userAccount: 'chris',
    userPassword: '000000',
})
    .then(function (docRef) {
        console.log('Document written with ID: ', docRef.id);
    })
    .catch(function (error) {
        console.error('Error adding document: ', error);
    });
```

---

## 註冊與驗證

需要引入firebase-auth.js才能使用auth();
```javascript=
<script src="https://www.gstatic.com/firebasejs/7.15.5/firebase-auth.js"></script>
```

```javascript=
firebase.auth().createUserWithEmailAndPassword(email, password)
.then(() => {
    ...
})
.catch((error) => {
    console.log(error.message);
});
```

[在网站上开始使用 Firebase 身份验证](https://firebase.google.com/docs/auth/web/start)


## 登入

```javascript=
firebase.auth().signInWithEmailAndPassword(email, password)
.then(() => {
    ...
})
.catch((error) => {
  console.log(error.message);
});
```

```javascript=
var user = firebase.auth().currentUser;

if (user) {
  // User is signed in.
} else {
  // No user is signed in.
}
```

但是 firebase.auth().currentUser 只會取得當前的登入狀態，也就是如果登出後，它也不會改變。

如果想要即時收到使用者當前的登入狀態，可以使用這個方法:

它會在登入狀態變動時執行 callback function，有點像是 Realtime database 的 on 功能。

```javascript=
firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});
```

## 讀寫權限

權限規則主要使用這三個:

* read: 限制讀取的權限
* write 限制寫入的權限
* validate: 資料驗證(ex: 要寫入的成績是不是在 0~100 之間)

## 小工具

接下來測試讀寫規則時，不用辛苦地來回網頁與 JS，可以使用規則頁面的模擬工具

