数年前(2017頃)にサーバーレスなる謎用語がバズっていた。GoogleのFirebaseを指していたのだが、今ではFirebase似のサービスのローカルで実行可能だ。Pocketbaseがそれなのだが、この記事では認証サービスを例にサーバーレスとは何なのかを調べたので記録しておく。以下の情報はGrokに尋ねて得た。
-
Firebase、Supabaseを利用すると何が便利? 認証機能とは次の機能の事で
- 登録
- ログイン
- パスワードリセット
- 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() }