diff --git a/src/api/auth.js b/src/api/auth.js
new file mode 100644
index 0000000..a8bce76
--- /dev/null
+++ b/src/api/auth.js
@@ -0,0 +1,4 @@
+import { userHttp } from './http'
+
+export const loginWithPassword = (username, password) =>
+ userHttp.post('/auth/login', { username, password })
diff --git a/src/pages/LoginPage.vue b/src/pages/LoginPage.vue
index b9e9176..59f4c6e 100644
--- a/src/pages/LoginPage.vue
+++ b/src/pages/LoginPage.vue
@@ -4,21 +4,27 @@
請輸入 Authentik Access Token 登入 使用 Authentik 帳號密碼登入member.ose.tw
-
- Token 從 Authentik 取得,存於本機 localStorage -
+登入成功後 access token 會存於本機 localStorage
@@ -53,29 +57,34 @@ import { ref } from 'vue' import { useRouter, useRoute } from 'vue-router' import { useAuthStore } from '@/stores/auth' +import { loginWithPassword } from '@/api/auth' const router = useRouter() const route = useRoute() const authStore = useAuthStore() -const token = ref('') +const username = ref('') +const password = ref('') const loading = ref(false) const error = ref('') async function handleLogin() { - if (!token.value.trim()) return + if (!username.value.trim() || !password.value.trim()) return loading.value = true error.value = '' try { - authStore.setToken(token.value.trim()) + const loginRes = await loginWithPassword(username.value.trim(), password.value) + authStore.setToken(loginRes.data.access_token) await authStore.fetchMe() const redirect = route.query.redirect || '/me' router.push(redirect) } catch (err) { authStore.logout() const detail = err.response?.data?.detail - if (detail === 'missing_bearer_token' || detail === 'invalid_bearer_token') { - error.value = 'Token 無效或已過期,請重新取得' + if (detail === 'invalid_username_or_password') { + error.value = '帳號或密碼錯誤' + } else if (detail === 'authentik_login_not_configured') { + error.value = '後端尚未設定 Authentik 登入參數' } else { error.value = '登入失敗,請稍後再試' }