diff --git a/CHANGELOG.md b/CHANGELOG.md index 14e1df3..f2d7b79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [1.0.5] - 2026-05-XX + +### Added + +### Changed + +### Fixed +- Redirect to `/login` when there is no refresh token. +- Default scopes omit `offline_access`. + ## [1.0.4] - 2026-05-11 ### Added diff --git a/package.json b/package.json index 91f334f..c7334b5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "stalwart-webui", "private": true, - "version": "1.0.4", + "version": "1.0.5", "description": "Stalwart WebUI", "type": "module", "scripts": { diff --git a/src/components/layout/ProtectedRoute.tsx b/src/components/layout/ProtectedRoute.tsx index 219e63f..7b1e710 100644 --- a/src/components/layout/ProtectedRoute.tsx +++ b/src/components/layout/ProtectedRoute.tsx @@ -8,10 +8,10 @@ import { Navigate, useLocation } from 'react-router-dom'; import { useAuthStore } from '@/stores/authStore'; export function ProtectedRoute({ children }: { children: React.ReactNode }) { - const accessToken = useAuthStore((s) => s.accessToken); + const authenticated = useAuthStore((s) => s.isAuthenticated()); const bypassToken = import.meta.env.VITE_ACCESS_TOKEN; const location = useLocation(); - if (!accessToken && !bypassToken) { + if (!authenticated && !bypassToken) { const originalPath = location.pathname + location.search; return ; } diff --git a/src/services/api.ts b/src/services/api.ts index ae2c3df..b8d6745 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -107,11 +107,17 @@ export async function apiFetch(path: string, options?: RequestInit): Promise { - const { authorization_endpoint, token_endpoint, end_session_endpoint, scopes_supported } = - await discover(username); + const { authorization_endpoint, token_endpoint, end_session_endpoint, scopes_supported } = await discover(username); const codeVerifier = generateCodeVerifier(); const { challenge: codeChallenge, method: codeChallengeMethod } = await generateCodeChallenge(codeVerifier); @@ -167,7 +166,7 @@ export async function startAuthFlow(username: string, returnUrl?: string | null) if (SCOPES && SCOPES.length > 0) { scope = SCOPES; } else if (scopes_supported?.includes('openid')) { - scope = ['openid', 'email', 'profile'].filter((s) => scopes_supported.includes(s)).join(' '); + scope = ['openid', 'email', 'profile', 'offline_access'].filter((s) => scopes_supported.includes(s)).join(' '); } else { scope = ''; }