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 @@ - + + + + 登入 -

- 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 = '登入失敗,請稍後再試' }