feat(auth): koppla login/register till Firebase → /v1/auth/session (AUTH-5)

This commit is contained in:
Sven (AAMOS AI)
2026-08-15 20:47:11 +07:00
parent 8352c3a0ce
commit 5f547708ae
3 changed files with 15 additions and 7 deletions
+2 -1
View File
@@ -26,6 +26,7 @@ import { createFirebaseTokenVerifier, type TokenVerifier } from "../lib/token-ve
/** Body-schema för Firebase-sessionväxling. */ /** Body-schema för Firebase-sessionväxling. */
const firebaseSessionInputSchema = z.object({ const firebaseSessionInputSchema = z.object({
idToken: z.string().min(1), idToken: z.string().min(1),
displayName: z.string().optional(),
locale: z.string().optional(), locale: z.string().optional(),
}); });
@@ -168,7 +169,7 @@ export async function authRoutes(app: FastifyInstance) {
if (!user) { if (!user) {
if (!identity.email) throw errors.badRequest("Firebase-token saknar e-postadress."); if (!identity.email) throw errors.badRequest("Firebase-token saknar e-postadress.");
const locale = input.locale ?? "sv-SE"; const locale = input.locale ?? "sv-SE";
const displayName = identity.name ?? identity.email.split("@")[0] ?? "Användare"; const displayName = input.displayName ?? identity.name ?? identity.email.split("@")[0] ?? "Användare";
[user] = await app.db [user] = await app.db
.insert(schema.users) .insert(schema.users)
.values({ .values({
+6 -2
View File
@@ -2,6 +2,7 @@ import { useState } from "react";
import { Text, View } from "react-native"; import { Text, View } from "react-native";
import { Link, Redirect, router } from "expo-router"; import { Link, Redirect, router } from "expo-router";
import { api } from "@/lib/api"; import { api } from "@/lib/api";
import { firebaseAuthProvider } from "@/lib/auth-provider/firebase";
import { useAuth, type AuthUser } from "@/lib/auth"; import { useAuth, type AuthUser } from "@/lib/auth";
import { t } from "@/lib/i18n"; import { t } from "@/lib/i18n";
import { Body, Button, Input, Screen, Spacer, Title } from "@/components/ui"; import { Body, Button, Input, Screen, Spacer, Title } from "@/components/ui";
@@ -27,9 +28,12 @@ export default function LoginScreen() {
setBusy(true); setBusy(true);
setError(null); setError(null);
try { try {
const result = await api<LoginResponse>("/v1/auth/login", { await firebaseAuthProvider.signInWithEmail(email.trim(), password);
const idToken = await firebaseAuthProvider.getIdToken();
if (!idToken) throw new Error(t("common.error"));
const result = await api<LoginResponse>("/v1/auth/session", {
method: "POST", method: "POST",
body: { email, password }, body: { idToken },
}); });
await setSession( await setSession(
{ accessToken: result.accessToken, refreshToken: result.refreshToken }, { accessToken: result.accessToken, refreshToken: result.refreshToken },
+7 -4
View File
@@ -2,6 +2,7 @@ import { useState } from "react";
import { Text, View } from "react-native"; import { Text, View } from "react-native";
import { Link, router } from "expo-router"; import { Link, router } from "expo-router";
import { api } from "@/lib/api"; import { api } from "@/lib/api";
import { firebaseAuthProvider } from "@/lib/auth-provider/firebase";
import { persistLanguageTag, useAuth, type AuthUser } from "@/lib/auth"; import { persistLanguageTag, useAuth, type AuthUser } from "@/lib/auth";
import { detectDeviceLanguageTag, t } from "@/lib/i18n"; import { detectDeviceLanguageTag, t } from "@/lib/i18n";
import { localeDefaultsForRegion } from "@app/shared-types"; import { localeDefaultsForRegion } from "@app/shared-types";
@@ -28,13 +29,15 @@ export default function RegisterScreen() {
setBusy(true); setBusy(true);
setError(null); setError(null);
try { try {
const result = await api<RegisterResponse>("/v1/auth/register", { await firebaseAuthProvider.signUpWithEmail(email.trim(), password);
const idToken = await firebaseAuthProvider.getIdToken();
if (!idToken) throw new Error(t("common.error"));
const result = await api<RegisterResponse>("/v1/auth/session", {
method: "POST", method: "POST",
body: { body: {
idToken,
displayName, displayName,
email, // D-031: enhetens språk backend skapar locale-preferenser.
password,
// D-031: enhetens språk backend skapar locale-preferenser före välkomstmejlet.
locale: detectDeviceLanguageTag() ?? "sv-SE", locale: detectDeviceLanguageTag() ?? "sv-SE",
}, },
}); });