Tana Gone
Tana Gone
1 min read

Categories

数年前(2017頃)にサーバーレスなる謎用語がバズっていた。GoogleのFirebaseを指していたのだが、今ではFirebase似のサービスのローカルで実行可能だ。Pocketbaseがそれなのだが、この記事では認証サービスを例にサーバーレスとは何なのかを調べたので記録しておく。以下の情報はGrokに尋ねて得た。

  • Firebase、Supabaseを利用すると何が便利? 認証機能とは次の機能の事で

    1. 登録
    2. ログイン
    3. パスワードリセット
    4. Google, X, Githubなどのソーシャルログイン

    ゼロからの構築することを考えるとサービスを利用してアプリ開発に集中できるメリットは大きい。

  • Firebase、Supabaseのコード例 UserオブジェクトにはUID, mail address, tokenが含まれる

    import FirebaseAuth
      
    // ログイン例
    Auth.auth().signIn(withEmail: email, password: password) { authResult, error in
        if let error = error {
            print("ログイン失敗: \(error.localizedDescription)")
            // エラー処理(例:間違ったパスワード、ユーザー不存在など)
        } else {
            print("ログイン成功: \(authResult?.user.uid ?? "")")
            // ログイン成功時の処理
        }
    }
    

    Supabaseの場合、ログイン成功時にセッション情報が得られる。セッション情報にはAccess Token, Refresh Token, User Infoが含まれる

    import Supabase
      
    let client = SupabaseClient(supabaseURL: URL(string: "YOUR_SUPABASE_URL")!, supabaseKey: "YOUR_SUPABASE_KEY")
      
    // ログイン例
    Task {
        do {
            let session = try await client.auth.signIn(email: email, password: password)
            print("ログイン成功: \(session.user.id)")
            // 成功時の処理
        } catch {
            print("ログイン失敗: \(error.localizedDescription)")
            // エラー処理
        }
    }
    
  • PocketBaseの場合 Swift SDKが用意されていない。POSTリクエストでidentity(メールまたはユーザー名)とpasswordを送信

    import Foundation
      
    func loginToPocketBase(email: String, password: String, completion: @escaping (Result<String, Error>) -> Void) {
        let url = URL(string: "http://127.0.0.1:8090/api/collections/users/auth-with-password")!
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
      
        let body: [String: String] = [
            "identity": email,
            "password": password
        ]
        request.httpBody = try? JSONSerialization.data(withJSONObject: body)
      
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            if let error = error {
                completion(.failure(error))
                return
            }
      
            guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
                completion(.failure(NSError(domain: "", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid response"])))
                return
            }
      
            if let data = data {
                do {
                    if let json = try JSONSerialization.jsonObject(with: data) as? [String: Any],
                       let token = json["token"] as? String {
                        completion(.success(token))
                    } else {
                        completion(.failure(NSError(domain: "", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid data"])))
                    }
                } catch {
                    completion(.failure(error))
                }
            }
        }
        task.resume()
    }
    

    Web APIs reference - API Records - Docs - PocketBase