Implemented auth app authentication in API mode (if loading the app itself wasn't blocked). Removed unnecessary toasts when entering restricted pages.

This commit is contained in:
Leo Vasanko
2025-12-02 15:25:31 +00:00
parent 2c777661b8
commit d1a7a53c19
9 changed files with 243 additions and 65 deletions
+5
View File
@@ -173,6 +173,11 @@ const saveName = async () => {
try {
saving.value = true
const res = await fetch('/auth/api/user/display-name', { method: 'PUT', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ display_name: name }) })
if (res.status === 401) {
authStore.authRequired = true
authStore.showMessage('Authentication required', 'error')
return
}
const data = await res.json()
if (!res.ok || data.detail) throw new Error(data.detail || 'Update failed')
showNameDialog.value = false
@@ -64,6 +64,9 @@
import { ref, onMounted, watch, computed, nextTick } from 'vue'
import QRCode from 'qrcode/lib/browser'
import { formatDate } from '@/utils/helpers'
import { useAuthStore } from '@/stores/auth'
const authStore = useAuthStore()
const props = defineProps({
endpoint: { type: String, required: true },
@@ -90,6 +93,11 @@ const expirationMessage = computed(() => {
async function fetchLink() {
try {
const res = await fetch(props.endpoint, { method: 'POST' })
if (res.status === 401) {
authStore.authRequired = true
emit('close')
return
}
const data = await res.json()
if (data.detail) throw new Error(data.detail)
url.value = data.url
+2 -10
View File
@@ -116,21 +116,13 @@ async function fetchSettings() {
async function fetchUserInfo() {
try {
const res = await fetch('/auth/api/user-info', { method: 'POST' })
if (!res.ok) {
const payload = await safeParseJson(res)
showMessage(payload.detail || 'Unable to load user session info.', 'error', 2000)
return
}
if (!res.ok) return
userInfo.value = await res.json()
// In login mode, if the user is authenticated but still here, they lack permissions.
// In reauth mode, being authenticated is expected - we just need re-verification.
if (isAuthenticated.value && props.mode !== 'reauth') {
showMessage('Permission Denied', 'error', 2000)
emit('forbidden', userInfo.value)
}
if (isAuthenticated.value && props.mode !== 'reauth') emit('forbidden', userInfo.value)
} catch (error) {
console.error('Failed to load user info', error)
showMessage('Could not contact the authentication server', 'error', 2000)
}
}