2017年6月30日金曜日

Firebase で Database を使う方法

概要

前回 アノニマス認証の方法を紹介しました
今回は認証後に Firebase のリアルタイム Database にアクセスしてみたいと思います
データベースのルールを変更することで認証しているかどうかでアクセスできるかできないかも検証してみます

環境

  • macOS X 10.12.5
  • Xcode 8.3.3 (8E3004b)
  • Firebase/Core/Auth/Database 4.0.2

データベースへのアクセスルール

とりあえず以下のように設定します

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

このルールは「どんなアカウントでもいいので認証済み」であれば read も write もできるルールになります

データベースに保存する

  • ViewController.swift
import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase

class ViewController: UIViewController {

    var ref: DatabaseReference!

    override func viewDidLoad() {
        super.viewDidLoad()
        Auth.auth().signInAnonymously(completion: { (user, error) in
            if let e = error {
                print(e)
                print("login error")
                return
            }
            print(user?.displayName ?? "no displayName")
            print(user?.isAnonymous ?? false)
            self.ref = Database.database().reference()
            // データの保存
            self.ref.child("users").setValue(["username": user?.uid])
        })
    }
}

データベースを参照するための変数「ref」を定義しておきログイン後に接続します (Database.database().reference())
そして ref.child.setValue を使ってデータを保存します
認証に成功するとデータベースに write する権限があるため以下のようにデータが投入されます
firebase_anonymous3.png

権限を変更して挙動を確認する

次に write の権限を変更してみます

{
  "rules": {
    ".read": "auth != null",
    ".write": false
  }
}

false に変更しました
こうすることでデータベースに対してどんなユーザでもアクセスできなくなります
実際にアプリをビルドし直して試してみるとコンソールに

<Warning> [Firebase/Database][I-RDB038012] setValue: or removeValue: at /users failed: permission_denied

というデバッグ文が出力されているのがわかると思います

データを取得する

ついでに取得もやってみましょう
* ViewController.swift

// データの取得
self.ref.child("users").observeSingleEvent(of: .value, with: { (snapshot) in
    print(snapshot.value ?? "no value")
})

を保存の下に追記すれば OK です
今回は observeSingleEvent を使いました
リアルタイム Database にはイベントドリブンでデータを取得する方法もありデータが追加されたらイベントが発行され、その都度何か処理する方法もあります

その辺りの方法は参考サイトの URL を参考に試してみてください
やり方はほとんど同じようにできると思います

最後に

Firebase のリアルタイム Database を使ってみました
また今回は使いませんでしたが、イベントドリブンな取得もできるのでチャットアプリなどの開発が捗る機能かなと思います

参考サイト

0 件のコメント:

コメントを投稿