Errors

BrowserConfigurationAuthErrors

stubbed_public_client_application_called

Hata Mesajı: Public Client Application'ın stub örneği çağrıldı. msal-react kullanıyorsanız, lütfen sağlayıcı olmadan bağlam kullanılmadığından emin olun.

Bkz. msal-react hataları

BrowserAuthErrors

Etkileşim_devam_ediyor

Hata İletisi: Etkileşim şu anda devam ediyor. Lütfen etkileşimli bir API çağırmadan önce bu etkileşimin tamamlandığından emin olun.

Bu hata, başka bir etkileşimli API sürmekteyken etkileşimli bir API (loginPopup, loginRedirect, acquireTokenPopup, acquireTokenRedirect) çağrıldığında oluşur. login ve acquireToken API'leri eşzamansızdır; bu nedenle, bir diğerini çağırmadan önce dönen promise'ların çözümlendiğinden emin olmanız gerekir.

ya loginPopup kullanma ya da acquireTokenPopup

Bu API'lerden döndürülen promise'ın, başka birini çağırmadan önce çözümlendiğinden emin olun.

❌ Aşağıdaki örnek, acquireTokenPopup çağrıldığında loginPopup hâlâ devam ediyor olacağından bu hatayı verir:

const request = { scopes: ["openid", "profile"] };
loginPopup();
acquireTokenPopup(request);

✔️ Bunu çözmek için, başka bir api çağırmadan önce tüm etkileşimli API'lerin çözümlenmiş olduğundan emin olmanız gerekir:

const request = { scopes: ["openid", "profile"] };
await msalInstance.loginPopup();
await msalInstance.acquireTokenPopup(request);

ya loginRedirect kullanma ya da acquireTokenRedirect

Yeniden yönlendirme API'leri kullanılırken, handleRedirectPromise yeniden yönlendirmeden geri dönerken çağrılmalıdır. Bu, sunucudan gelen belirteç yanıtının düzgün bir şekilde işlenmesini ve geçici önbellek girdilerinin temizlenmesini sağlar. handleRedirectPromise, uygulama loginRedirect veya acquireTokenRedirect öğesini çağırmadan önce tamamlanma fırsatı bulamadığında bu hata oluşur.

❌ Aşağıdaki örnek, loginRedirect ikinci kez çağrıldığında handleRedirectPromise önceki bir loginRedirect çağrısından gelen yanıtı hâlâ işliyor olacağı için bu hatayı verir:

msalInstance.handleRedirectPromise();

const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
    // No user signed in
    msalInstance.loginRedirect();
}

✔️ Sorunu çözmek için handleRedirectPromise , herhangi bir etkileşimli API'yi çağırmadan önce çözümlemeyi beklemeniz gerekir:

await msalInstance.handleRedirectPromise();

const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
    // No user signed in
    msalInstance.loginRedirect();
}

Alternatif olarak:

msalInstance
    .handleRedirectPromise()
    .then((tokenResponse) => {
        if (!tokenResponse) {
            const accounts = msalInstance.getAllAccounts();
            if (accounts.length === 0) {
                // No user signed in
                msalInstance.loginRedirect();
            }
        } else {
            // Do something with the tokenResponse
        }
    })
    .catch((err) => {
        // Handle error
        console.error(err);
    });

Not:redirectUri olmayan bir sayfadan loginRedirect veya acquireTokenRedirect çağırıyorsanız, handleRedirectPromise öğesinin hem redirectUri sayfasında hem de yeniden yönlendirmeyi başlattığınız sayfada çağrıldığından ve tamamlanmasının beklendiğinden emin olmanız gerekir. Bunun nedeni, redirectUri sayfasının başlangıçta loginRedirect öğesini çağıran sayfaya yeniden yönlendirme başlatması ve bu sayfanın belirteç yanıtını işleyecek olmasıdır.

Sarmalayıcı Kitaplıklar

Sarmalayıcı kitaplıklarımızdan birini (React veya Angular) kullanıyorsanız, bu hatayı alıyor olabileceğiniz ek nedenler için lütfen bu özel kitaplıklardaki hata belgelerine bakın:

Sarmalayıcı kitaplıklarından herhangi birini kullanmıyor ancak uygulamanızın eşzamanlı etkileşimli istekleri tetikleyebileceğinden endişeleniyorsanız, belirteç alma yönteminizde bir etkileşim çağırmadan önce devam eden başka bir etkileşim olup olmadığını denetlemeniz gerekir. Bunu, MSAL Olayları API'sini kullanarak geçerli MSAL etkileşim durumunu yayan genel bir uygulama durumu veya yayın hizmeti vb. uygulayarak gerçekleştirebilirsiniz.

❌ Aşağıdaki örnek, catch bloğundaki acquireTokenPopup o anda başka bir etkileşim olup olmadığını denetlemediği için bu hataya neden olur:

async function myAcquireToken(request) {
    const msalInstance = getMsalInstance(); // get the msal application instance

    const tokenRequest = {
        account: msalInstance.getActiveAccount() || null;
        ...request
    };

    let tokenResponse;

    try {
        // attempt silent acquisition first
        tokenResponse = await msalInstance.acquireTokenSilent(tokenRequest);
    } catch (error) {
        if (error instanceof InteractionRequiredAuthError) {
            try {
                tokenResponse = await msalInstance.acquireTokenPopup(tokenRequest);
            } catch (err) {
                console.log(err);
                // handle other errors
            }
        }

        console.log(error);
        // handle other errors
    }

    return tokenResponse;
};

const request = {
    scopes: ["User.Read"]
};

myAcquireToken(request);
myAcquireToken(request);

✔️ Sorunu çözmek için, diğer etkileşimli API'leri çağırmadan önce etkileşim durumunun olmasını None beklemeniz gerekir:

async function myAcquireToken(request) {
    const msalInstance = getMsalInstance(); // get the msal application instance

    const tokenRequest = {
        account: msalInstance.getActiveAccount() || null;
        ...request
    };

    let tokenResponse;

    try {
        // attempt silent acquisition first
        tokenResponse = await msalInstance.acquireTokenSilent(tokenRequest);
    } catch (error) {
        if (error instanceof InteractionRequiredAuthError) {
            // check for any interactions
            if (myGlobalState.getInteractionStatus() !== InteractionStatus.None) {
                // throw a new error to be handled in the caller below
                throw new Error("interaction_in_progress");
            } else {
                // no interaction, invoke popup flow
                tokenResponse = await msalInstance.acquireTokenPopup(tokenRequest);
            }
        }

        console.log(error);
        // handle other errors
    }

    return tokenResponse;
};

async function myInteractionInProgressHandler() {
    /**
     * "myWaitFor" method polls the interaction status via getInteractionStatus() from
     * the application state and resolves when it's equal to "None".
     */
    await myWaitFor(() => myGlobalState.getInteractionStatus() === InteractionStatus.None);

    // wait is over, call myAcquireToken again to re-try acquireTokenSilent
    return (await myAcquireToken(tokenRequest));
};

const request = {
    scopes: ["User.Read"]
};

myAcquireToken(request).catch((e) => myInteractionInProgressHandler());
myAcquireToken(request).catch((e) => myInteractionInProgressHandler());

Sorun Giderme Adımları

  • Ayrıntılı günlük kaydını etkinleştirin ve olayların sırasını takip edin. handleRedirectPromise öğesinin çağrıldığını ve herhangi bir login veya acquireToken API’si çağrılmadan önce döndüğünü doğrulayın.

Bu hatanın neden oluştuğunun nedenini bulamıyorsanız lütfen bir sorun açın ve aşağıdaki bilgileri paylaşmaya hazır olun:

  • Ayrıntılı günlükler
  • Sorunu yeniden oluşturmak için kullanabileceğimiz örnek bir uygulama ve/veya kod parçacıkları
  • Sayfayı yenileyin. Hata gider mi?
  • Uygulamanızı yeni bir sekmede açın. Hata gider mi?

block_iframe_reload

Hata İletisi: MSAL bir kimlik doğrulama yanıtı algıladığı için istek bir iframe içinde engellendi.

ssoSilent veya acquireTokenSilent çağrıldığında ve redirectUri olarak kullanılan sayfa login veya acquireToken işlevini çağırmaya çalışıyorsa bu hata oluşur. Bunun için önerdiğimiz çözüm, silent API’leri çağırırken redirectUri öğenizi MSAL’i uygulamayan boş bir sayfaya ayarlamaktır. Bu, gizli iframe'in sayfanızı işlemesi gerekmeyen performansı artırmanın da ek avantajına sahip olacaktır.

✔️ Bunu istek temelinde yapabilirsiniz, örneğin:

msalInstance.acquireTokenSilent({
    scopes: ["User.Read"],
    redirectUri: "http://localhost:3000/blank.html",
});

Bu yeni redirectUri uygulamayı Uygulama Kaydınıza kaydetmeniz gerektiğini unutmayın.

Bu amaç için ayrılmış özel bir redirectUri kullanmak istemiyorsanız, bunun yerine redirectUri öğenizin, sessiz API’ler tarafından kullanılan gizli iframe içinde işlendiğinde MSAL API’lerini çağırmaya çalışmadığından emin olmalısınız.

monitor_window_timeout

Hata İletileri:

  • Zaman aşımı nedeniyle iframe'de belirteç alımı başarısız oldu.

ssoSilent, acquireTokenSilent, acquireTokenPopup veya loginPopup çağrılırken bu hata oluşabilir ve bunun gerçekleşmesinin birkaç nedeni olabilir. En yaygın kullanılanlardan bazıları şunlardır:

  1. redirectUri olarak kullandığınız sayfa hash’i kaldırıyor veya değiştiriyor
  2. redirectUri olarak kullandığınız sayfa otomatik olarak farklı bir sayfaya yönlendiriliyor
  3. Kimlik sağlayıcınız tarafından kısıtlanıyorsunuz
  4. Kimlik sağlayıcınız sizi redirectUri konumuna geri yönlendirmedi.

Önemli: Uygulamanız bir yönlendirici kitaplığı (örneğin React Router, Angular Router) kullanıyorsa, MSAL belirteci alma işlemi devam ederken karmayı veya otomatik yeniden yönlendirmeyi kaldırmadığından emin olun. Mümkünse, sayfanızın redirectUri yönlendiriciyi hiç çağırmaması en iyisidir.

redirectUri sayfasının neden olduğu sorunlar

Sessiz arama yaptığınızda, bazı durumlarda bir iframe açılır ve kimlik sağlayıcınızın yetkilendirme sayfasına gider. Kimlik sağlayıcısı kullanıcıyı yetkilendirdikten sonra iframe'i, hash parçasında yer alan yetkilendirme kodu veya hata bilgileriyle birlikte yeniden redirectUri öğesine geri yönlendirir. İsteği başlangıçta yapan çerçevede veya pencerede çalışan MSAL örneği, bu yanıt karmasını çıkarır ve işler. redirectUri MSAL bu karma değerini ayıklamadan önce onu kaldırıyor, değiştiriyor veya farklı bir sayfaya yönlendiriyorsa bu zaman aşımı hatasını alırsınız.

✔️ Bu sorunu çözmek için, kullandığınız sayfanın redirectUri en azından bir açılır pencere veya iframe'e yüklendiğinde bu işlemlerden hiçbirini yapmadığından emin olmalısınız. Bu tür şeylerin gerçekleşmediğinden emin olmak için sessiz ve açılır akışlar için boş bir sayfa redirectUri kullanmanızı öneririz.

Bunu istek temelinde yapabilirsiniz, örneğin:

msalInstance.acquireTokenSilent({
    scopes: ["User.Read"],
    redirectUri: "http://localhost:3000/blank.html",
});

Bu yeni redirectUri uygulamayı Uygulama Kaydınıza kaydetmeniz gerektiğini unutmayın.

Angular ve React ile ilgili notlar:

  • @azure/msal-angular kullanıyorsanız, redirectUri sayfanız MsalGuard tarafından korunmamalıdır.
  • @azure/msal-react kullanıyorsanız, redirectUri sayfanız MsalAuthenticationComponent öğesini oluşturmamalı veya useMsalAuthentication kancasını kullanmamalıdır.

Kimlik Sağlayıcısı'nın neden olduğu sorunlar

Throttling

Bu hatanın oluşturulabilmesinin en yaygın nedenlerinden biri, uygulamanızın bir döngüde takılması veya kısa bir süre içinde çok fazla belirteç isteğinde bulunmasıdır. Bu gerçekleştiğinde, kimlik sağlayıcısı sonraki istekleri kısa bir süreliğine sınırlandırabilir; bu da redirectUri öğenize geri yönlendirilmemenize ve sonuç olarak bu hataya yol açabilir.

✔️ Kısıtlama kaynaklı sorunları çözmek için 2 seçeneğiniz vardır:

  1. Yeniden denemeden önce kısa bir süre için istekte bulunmayı durdurun.
  2. acquireTokenPopup veya acquireTokenRedirect gibi etkileşimli bir API çağırın.
X-Frame-Options Engelle

Kimlik Sağlayıcısı uygulamanıza yeniden yönlendiremezse de bu hatayı alabilirsiniz. Sessiz senaryolarda bu hataya bazen, kimlik sağlayıcınızın size bir hata iletisi göstermeye çalıştığını veya kullanıcı etkileşimi beklediğini gösteren bir “X-Frame-Options: Deny” hatası da eşlik eder.

✔️ X-Frame-Options hatasında genellikle bir URL olur ve bu url'yi yeni bir sekmede açmak neler olduğunu anlamanıza yardımcı olabilir. Etkileşim gerekiyorsa bunun yerine etkileşimli bir API kullanmayı göz önünde bulundurun. Bir hata görüntüleniyorsa hatayı giderin.

Bazı B2C akışlarının kullanıcı etkileşimi ihtiyaçları nedeniyle bu hatayı oluşturması beklenir. Bu akışlar şunlardır:

  • Parola sıfırlama
  • Profil düzenleme
  • Kaydolma
  • Nasıl yapılandırıldıklarına bağlı olarak bazı özel ilkeler
Ağ Gecikmesi

Kimlik sağlayıcısının uygulamanıza zamanında geri yönlendirmemesinin bir başka olası nedeni, ek ağ gecikmesi olmasıdır.

✔️ Varsayılan zaman aşımı yaklaşık 10 saniyedir ve çoğu durumda yeterli olmalıdır, ancak kimlik sağlayıcınızın yeniden yönlendirmesi bundan uzun sürüyorsa, MSAL yapılandırmasında bu zaman aşımını iframeHashTimeout, windowHashTimeout veya loadFrameTimeout yapılandırma parametreleriyle artırabilirsiniz.

const msalConfig = {
    auth: {
        clientId: "your-client-id",
    },
    system: {
        windowHashTimeout: 9000, // Applies just to popup calls - In milliseconds
        iframeHashTimeout: 9000, // Applies just to silent calls - In milliseconds
        loadFrameTimeout: 9000, // Applies to both silent and popup calls - In milliseconds
    },
};

hash_empty_error

Hata İletileri:

Hash değeri boş olduğu için işlenemez. Lütfen redirectUri'nizin karmayı temizlemediğini doğrulayın.

Bu hata, redirectUri'niz olarak kullandığınız sayfa karmayı kaldırdığında veya başka bir sayfaya otomatik olarak yeniden yönlendirildiğinde oluşur. Bu durum genellikle uygulama, başka bir rotaya gezinen ve bu sırada hash’i kaldıran bir yönlendirici uyguladığında ortaya çıkar.

Bu hatayı çözmek için yönlendiriciye tabi olmayan ayrılmış bir redirectUri sayfası kullanmanızı öneririz. Sessiz ve açılan aramalar için boş bir sayfa kullanmak en iyisidir. Bu mümkün değilse MSAL belirteci alma işlemi devam ederken yönlendiricinin gezinmediğinden emin olun. Bunu, sessiz çağrılar için uygulamanızın bir iframe'e yüklenip yüklenmediğini algılayarak, açılır pencere çağrıları için bir açılır pencerede olup olmadığını belirleyerek veya yeniden yönlendirme çağrıları için handleRedirectPromise öğesini bekleyerek yapabilirsiniz.

Hash bilinen özellikleri içermiyor

Hata İletileri:

Hash, bilinen özellikleri içermiyor. Lütfen redirectUri’nizin hash değerini değiştirmediğini doğrulayın.

Lütfen yukarıdaki hash_empty_error açıklamasına bakın. Bu hatanın kök nedeni benzerdir; fark şu ki hash değeri kaldırılmak yerine değiştirilmiştir.

unable_to_acquire_token_from_native_platform

Hata İletileri:

  • Yerel platformdan belirteç alınamıyor.

Bu hata, acquireTokenByCode API’si code yerine nativeAccountId ile çağrıldığında ve uygulama belirteçleri yerel broker’dan edinmeyen bir ortamda çalıştığında verilir. Ön koşulların listesi için lütfen cihaz bağlı belirteçleriyle ilgili belgeyi gözden geçirin.

Yerel bağlantı kurulamadı

Hata İletileri:

  • Yerel platformla bağlantı kurulmamıştır. Lütfen uyumlu bir tarayıcı uzantısı yükleyin ve initialize() komutunu çalıştırın.

Bu hata, kullanıcı yerel aracıyla oturum açtığında ancak şu anda yerel aracıyla bağlantı olmadığında oluşur. Bu, aşağıdaki nedenlerden kaynaklanabilir:

  • Windows Hesapları uzantısı kaldırıldı veya devre dışı bırakıldı
  • API initialize çağrılmadı veya başka bir MSAL API'sini çağırmadan önce beklenmedi

başlatılmamış_genel_istemci_uygulaması

Hata İletileri:

  • Başka bir MSAL API'sini çağırmaya çalışmadan önce initialize işlevini çağırmanız ve beklemeniz gerekir.

Bu hata, initialize API'si çağrılmadan önce login, acquireToken veya handleRedirectPromise API'si çağrıldığında oluşur. initialize API’si, belirteçleri almaya çalışmadan önce çağrılmalı ve yanıtı beklenmelidir.

❌ Aşağıdaki örnek, başlatma tamamlanmadan önce çağrıldığından handleRedirectPromise bu hatayı atar:

const msalInstance = new PublicClientApplication({
    auth: {
        clientId: "your-client-id",
    },
    system: {
        allowNativeBroker: true,
    },
});

await msalInstance.handleRedirectPromise(); // This will throw
msalInstance.acquireTokenSilent(); // This will also throw

✔️ Bunu çözmek için, başka herhangi bir MSAL API’sini çağırmadan önce initialize tamamlanana kadar beklemelisiniz:

const msalInstance = new PublicClientApplication({
    auth: {
        clientId: "your-client-id",
    },
    system: {
        allowNativeBroker: true,
    },
});

await msalInstance.initialize();
await msalInstance.handleRedirectPromise(); // This will no longer throw this error since initialize completed before this was invoked
msalInstance.acquireTokenSilent(); // This will also no longer throw this error

Other

Sunucu hataları gibi msal tarafından atılmayan hatalar

[url] adresinden getirme erişimi CORS ilkesi tarafından engellendi

Bu hata MSAL.js v2.x ile oluşur ve Azure portalUygulama Kaydı sırasında hatalı yapılandırmadan kaynaklanır. Özellikle, Uygulama Kaydınızdaki Kimlik Doğrulama bölmesi altında, redirectUri öğesinin şu türde kayıtlı olduğundan emin olmalısınız: Single-page application Başarıyla yapılırsa, şunu belirten yeşil bir onay işareti görürsünüz:

Yeniden Yönlendirme URI'niz PKCE ile Yetkilendirme Kodu Akışı için uygundur.

görüntü