Heim  >  Fragen und Antworten  >  Hauptteil

Initialisieren Sie die Svelte-Anwendung basierend auf dem Versprechen

<p>Ich habe zuvor mehrere Vue-Anwendungen entwickelt, die Keycloak zur Authentifizierung und Autorisierung verwendeten. Für Vue-Anwendungen bietet Keycloak eine Lösung, um sicherzustellen, dass nicht authentifizierte Benutzer keine Vue-Anwendungen laden können, indem die Anwendung nur dann initialisiert wird, wenn der Benutzer authentifiziert ist. </p> <pre class="brush:js;toolbar:false;">keycloak.init({ onLoad: initOptions.onLoad }).then((auth) => { if (!auth) { window.location.reload(); } anders { Vue.$log.info("Authentifiziert"); newVue({ el: '#app', render: h => h(App, { props: { keycloak: keycloak } }) }) } ... </pre> <p>Jetzt arbeite ich an einem Svelte-Projekt und möchte denselben Ansatz anwenden. Gibt es eine Möglichkeit, eine Svelte-Anwendung basierend auf Promises zu initialisieren, ähnlich wie es in Vue mit Keycloak gemacht wird? </p> <p>Ich habe versucht, nach einer Lösung zu suchen, kann aber nichts finden, das dieses Problem speziell für Svelte angeht. </p> <p>Der größte Vorteil für mich besteht darin, dass Sie immer zu 100 % sicher sind, dass der Benutzer authentifiziert ist, und Sie immer Zugriff auf das JWT-Token haben, um es bei Bedarf an das Backend zu senden. </p>
P粉872101673P粉872101673435 Tage vor533

Antworte allen(1)Ich werde antworten

  • P粉724256860

    P粉7242568602023-09-02 07:57:11

    单独使用 Svelte 时,您可以使用 Client-侧组件API

    import App from "./App.svelte"
    
    keycloak.init({ onLoad: initOptions.onLoad }).then((auth) => {
      if (!auth) {
        window.location.reload();
      } else {
        new App({
          target: document.getElementById('#app'),
          props: { keycloak: keycloak } })
        })
      }

    在 SvelteKit 应用中,您可以使用 src/routes/+layout.js 添加全局行为:

    // layout.js
    import { browser } from "$app/environment";
    
    /**
     * @type {import('./$types').LayoutLoad}
     */
    export const load = async () => {
      let keycloakPromise;
      if (browser) {
        keycloakPromise = keycloak.init({ onLoad: initOptions.onLoad }).then((auth) => {
          if (auth) {
            return keycloak;
          }
        });
      }
      return {
        keycloak: keycloakPromise,
      };
    };
    <!-- layout.svelte -->
    <script>
      import { onMount } from "svelte";
    
      /** @type {import('./$types').LayoutData} */
      export let data;
    
      onMount(() => {
        if (!data.keycloak) {
          window.location.reload();
        }
      });
    </script>
    
    {#if data.keycloak}
      <slot />
    {/if}
    

    data.keycloak未定义时,认证失败。 这允许有条件地渲染内容。

    (代码示例假设 keycloak 是客户端身份验证)

    Antwort
    0
  • StornierenAntwort