feat(auth): adicionar suporte nativo a Single Sign-On do BrainSteel Hub com fallback para Logto
This commit is contained in:
+45
-1
@@ -67,6 +67,33 @@ async function syncUserToProfile(user: LogtoUser): Promise<string> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Detecta sessão ativa do BrainSteel Hub (Single Sign-On unificado)
|
||||||
|
function getHubUser(): LogtoUser | null {
|
||||||
|
try {
|
||||||
|
const raw = localStorage.getItem('brainsteel_session');
|
||||||
|
if (!raw) return null;
|
||||||
|
const session = JSON.parse(raw);
|
||||||
|
if (!session || (!session.token && !session.isMaster && !session.user)) return null;
|
||||||
|
|
||||||
|
const u = session.user || {};
|
||||||
|
const email = u.email || (session.isMaster ? 'admbrainsteel@gmail.com' : 'user@brainsteel.com.br');
|
||||||
|
const name = u.name || u.full_name || (session.isMaster ? 'Master Root' : 'Usuário BrainSteel');
|
||||||
|
const sub = u.id || u.sub || (session.isMaster ? 'master-root-brainsteel' : `hub-${email}`);
|
||||||
|
|
||||||
|
return {
|
||||||
|
sub,
|
||||||
|
id: sub,
|
||||||
|
email,
|
||||||
|
name,
|
||||||
|
username: email.split('@')[0],
|
||||||
|
picture: u.picture || u.avatar_url,
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('[Hub SSO] Erro ao ler sessão do Hub:', e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export interface UseAuthReturn {
|
export interface UseAuthReturn {
|
||||||
user: LogtoUser | null;
|
user: LogtoUser | null;
|
||||||
loading: boolean;
|
loading: boolean;
|
||||||
@@ -88,8 +115,22 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
|||||||
const [isRecoveryFlow, setIsRecoveryFlow] = useState(false);
|
const [isRecoveryFlow, setIsRecoveryFlow] = useState(false);
|
||||||
const callbackHandled = useRef(false);
|
const callbackHandled = useRef(false);
|
||||||
|
|
||||||
// Detecta callback URL e processa
|
// Inicialização de autenticação: prioridade para o BrainSteel Hub SSO
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
// 1. Detectar sessão nativa do BrainSteel Hub (marcos-vps)
|
||||||
|
const hubUser = getHubUser();
|
||||||
|
if (hubUser) {
|
||||||
|
console.log('🛡️ [Hub SSO] Sessão corporativa do BrainSteel detectada:', hubUser.email);
|
||||||
|
syncUserToProfile(hubUser).then((profileId) => {
|
||||||
|
hubUser.id = profileId;
|
||||||
|
setUser(hubUser);
|
||||||
|
setAuthInitialized(true);
|
||||||
|
setLoading(false);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Fluxo Logto clássico (Hostinger / Acesso autônomo sem Hub)
|
||||||
const url = new URL(window.location.href);
|
const url = new URL(window.location.href);
|
||||||
if (url.searchParams.has('code')) {
|
if (url.searchParams.has('code')) {
|
||||||
if (callbackHandled.current) return;
|
if (callbackHandled.current) return;
|
||||||
@@ -143,7 +184,10 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
|||||||
|
|
||||||
const signOut = useCallback(async () => {
|
const signOut = useCallback(async () => {
|
||||||
localStorage.removeItem('userLoginTime');
|
localStorage.removeItem('userLoginTime');
|
||||||
|
localStorage.removeItem('brainsteel_session');
|
||||||
|
document.cookie = 'bs_master=; domain=.brainsteel.com.br; path=/; max-age=0';
|
||||||
setIsRecoveryFlow(false);
|
setIsRecoveryFlow(false);
|
||||||
|
setUser(null);
|
||||||
await logtoSignOut();
|
await logtoSignOut();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user