Statut
Le statut du package est Package actuel. Les stores Svelte 5, lehook serveur SvelteKit et les utilitaires auxiliaires sont implémentés. Unaller-retour réel avec un IdP sur une infrastructure de production est enattente de vérification manuelle.
Configuration du client
Créez des stores dans la mise en page racine avec createXidStoreset setXidContext. Les stores utilisent XidClient.subscribe,ce qui satisfait le contrat d’abonnement des stores Svelte.
<!-- +layout.svelte -->
<script lang="ts">
import { setContext, onMount } from 'svelte'
import { XidClient, createXidStores, setXidContext } from '@xid-kit/svelte'
const client = new XidClient({ apiUrl: 'https://acme.xid.dev' })
const stores = createXidStores(client)
setXidContext(setContext, stores)
onMount(() => {
const ac = new AbortController()
void client.load({ signal: ac.signal })
return () => ac.abort()
})
</script>
<slot />Lecture de l’état d’authentification
<!-- Any child component -->
<script lang="ts">
import { getContext } from 'svelte'
import { getXidContext } from '@xid-kit/svelte'
const { auth, user } = getXidContext(getContext)
// $auth: { isLoaded, isSignedIn, userId, sessionId, session }
// $user: discriminated union on isLoaded / isSignedIn / user
</script>
{#if !$auth.isLoaded}
<p>Loading...</p>
{:else if $auth.isSignedIn}
<p>Hello, {$user.isSignedIn ? $user.user.fullName : ''}</p>
{:else}
<p>Not signed in</p>
{/if}Connexion et déconnexion
<script lang="ts">
import { getContext } from 'svelte'
import { getXidContext, buildSignInUrl, executeSignOut } from '@xid-kit/svelte'
const { client } = getXidContext(getContext)
function handleSignIn() {
window.location.assign(buildSignInUrl('/sign-in', window.location.href))
}
async function handleSignOut() {
await executeSignOut(client, { redirectUrl: '/' })
}
</script>Guard de rôle et permission
<script lang="ts">
import { getContext } from 'svelte'
import { getXidContext, isAllowed } from '@xid-kit/svelte'
const { state } = getXidContext(getContext)
</script>
{#if isAllowed($state, { role: 'org:admin' })}
<AdminPanel />
{/if}
{#if isAllowed($state, { permission: 'org:member:write' })}
<EditButton />
{/if}Hook serveur SvelteKit
// src/hooks.server.ts
import { handleXid } from '@xid-kit/svelte/server'
export const handle = handleXid({
jwtKey: JSON.parse(process.env.XID_JWT_KEY!),
issuer: 'https://xid.dev',
protectedRoutes: ['/dashboard', '/account'],
signInUrl: '/sign-in',
})Lecture de l’authentification dans les fonctions load
// +page.server.ts
import { redirect } from '@sveltejs/kit'
import { getXidAuth } from '@xid-kit/svelte/server'
import type { PageServerLoad } from './$types'
export const load: PageServerLoad = async ({ locals }) => {
const auth = getXidAuth(locals)
if (!auth.userId) throw redirect(303, '/sign-in')
return { userId: auth.userId, orgId: auth.orgId }
}Typage de App.Locals
// src/app.d.ts
import type { AuthResult } from '@xid-kit/svelte/server'
declare global {
namespace App {
interface Locals {
xidAuth: AuthResult
}
}
}
export {}API exportée
| Exporter | Type | Module |
|---|---|---|
XidClient, createXidStores, setXidContext, getXidContext |
configuration du client | @xid-kit/svelte |
buildSignInUrl, executeSignOut, isAllowed |
utilitaires | @xid-kit/svelte |
handleXid, getXidAuth |
hook serveur | @xid-kit/svelte/server |