Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu kılavuz, MSAL Browser v5'te tanıtılan yeniden yönlendirme köprüsü sayfasını ayarlamak için çerçeveye özgü yönergeler sağlar. Yeniden yönlendirme köprüsünün neden gerekli olduğuna ilişkin arka plan için bkz. v4'den v5'e geçiş kılavuzu.
Warning
Yeniden yönlendirme köprüsü sayfası üst bilgilerle sunulmamalıdırCross-Origin-Opener-Policy. Köprü sayfası, IdP OAuth akışını tamamladıktan sonra kimlik doğrulama yanıtını alan bir aracıdır. Köprü sayfasında COOP başlıkları ayarlanırsa, tarayıcı ana uygulamaya geri uzanan iletişim kanalını koparan bir tarama bağlamı grubu değişimi yapar ve böylece köprünün çözmek için tasarlandığı sorunun aynısını yeniden ortaya çıkarır.
Important
Yeni yeniden yönlendirme köprüsü sayfasına işaret etmek üzere güncelleştirdikten redirectUri sonra, Entra ID uygulama kaydınızdaki yeniden yönlendirme URI'sini de güncelleştirmeniz GEREKIR.
Yol, protokol ve bağlantı noktası dahil olmak üzere URI tam olarak eşleşmelidir.
Uygulama kaydının güncelleştirilememesi hatalara redirect_uri_mismatch neden olur.
Angular
-
Yeniden yönlendirme köprüsü bileşenini oluşturun (
src/app/redirect/redirect.component.ts):
import { Component, OnInit } from "@angular/core";
import { broadcastResponseToMainFrame } from "@azure/msal-browser/redirect-bridge";
@Component({
selector: "app-redirect",
standalone: true,
template: "<p>Processing authentication...</p>",
})
export class RedirectComponent implements OnInit {
ngOnInit(): void {
broadcastResponseToMainFrame().catch((error: Error) => {
console.error("Error broadcasting response to main frame:", error);
});
}
}
-
/redirectYönlendirme yapılandırmanıza yolu ekleyin. Yeniden yönlendirme yolu dışındaMsalGuardolmalıdır ve yeniden yönlendirme sayfası, MSAL API'lerini tetikleyenMsalInterceptor(veya başka bir şekilde çağıran) API çağrıları yapmamalıdır:
import { RedirectComponent } from "./redirect/redirect.component";
const routes: Routes = [
{ path: "redirect", component: RedirectComponent },
// ... your other routes
];
- Derlemenin bileşeni içerdiğinden emin olun.
angular.jsonAngular yol bileşeni kullanılırken varlık değişikliği gerekmez; Angular CLI bileşeni otomatik olarak paketler. Yönlendirilen bir bileşen yerine statik birredirect.htmltercih ediyorsanız, onu assets dizisine ekleyin:
// angular.json
{
"projects": {
"your-app": {
"architect": {
"build": {
"options": {
"assets": [
{ "glob": "**/*", "input": "public" },
"src/redirect.html" // ← Add redirect bridge page
]
}
}
}
}
}
}
Örnek: Bkz. angular-standalone-sample ve angular-modules-sample.
Vite
Vite, redirect.html öğesinin derleme çıktısına ayrı bir giriş noktası olarak dahil edilmesi için çok sayfalı bir yapılandırma gerektirir.
-
Oluştur
redirect.htmlproje kökünüzde (yanındaindex.html):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Redirect</title>
</head>
<body>
<p>Processing authentication...</p>
<script type="module">
import { broadcastResponseToMainFrame } from "@azure/msal-browser/redirect-bridge";
broadcastResponseToMainFrame().catch((error) => {
console.error("Error broadcasting response:", error);
});
</script>
</body>
</html>
-
Güncelleştirme
vite.config.tsyeniden yönlendirme sayfasını ikinci bir girdi olarak eklemek için:
import { defineConfig } from "vite";
import { resolve } from "path";
export default defineConfig({
build: {
rollupOptions: {
input: {
main: resolve(__dirname, "index.html"),
redirect: resolve(__dirname, "redirect.html"), // ← Redirect bridge entry
},
},
},
});
Geliştirme sırasında (vite dev), yeniden yönlendirme sayfası otomatik olarak /redirect.html adresinde sunulur. Üretim derlemelerinde Rollup, çıktı dizininde hem index.html hem de redirect.html oluşturur.
Örnek:React-router-sample, typescript-sample ve b2c-sample'a bakın.
Webpack
Webpack, yeniden yönlendirme sayfası için ayrılmış bir giriş noktası ve bir HtmlWebpackPlugin örnek gerektirir.
-
Oluştur
src/redirect.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Redirect</title>
</head>
<body>
<p>Processing authentication...</p>
<!-- The redirect script bundle will be injected by HtmlWebpackPlugin (see redirect.js entry). -->
</body>
</html>
-
Oluştur
src/redirect.js(Webpack için giriş noktası):
import { broadcastResponseToMainFrame } from "@azure/msal-browser/redirect-bridge";
broadcastResponseToMainFrame().catch((error) => {
console.error("Error broadcasting response:", error);
});
-
Güncelleştirme
webpack.config.js:
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: {
main: "./src/index.js",
redirect: "./src/redirect.js", // ← Redirect bridge entry
},
plugins: [
new HtmlWebpackPlugin({
filename: "index.html",
template: "./src/index.html",
chunks: ["main"],
}),
new HtmlWebpackPlugin({
filename: "redirect.html",
template: "./src/redirect.html",
chunks: ["redirect"], // ← Only include the redirect chunk
}),
],
};
Next.js
Next.js sayfalar otomatik olarak yol haline gelir, bu nedenle yeniden yönlendirme köprüsü bir sayfa bileşenidir. Kurulum , Sayfa Yönlendiricisi ile Uygulama Yönlendiricisi arasında farklılık gösterir.
Sayfa Yönlendiricisi (pages/)
-
Oluştur
pages/redirect.js:
import { useEffect } from "react";
import { broadcastResponseToMainFrame } from "@azure/msal-browser/redirect-bridge";
export default function Redirect() {
useEffect(() => {
broadcastResponseToMainFrame().catch((error) => {
console.error("Error broadcasting response to main frame:", error);
});
}, []);
return <p>Processing authentication...</p>;
}
-
_app.jsiçinde, yeniden yönlendirme sayfasınıMsalProvideröğesinden hariç tutun:
// pages/_app.js
import { useRouter } from "next/router";
import { MsalProvider } from "@azure/msal-react";
function MyApp({ Component, pageProps }) {
const router = useRouter();
// The redirect page must NOT be wrapped in MsalProvider
if (router.pathname === "/redirect") {
return <Component {...pageProps} />;
}
return (
<MsalProvider instance={msalInstance}>
<Component {...pageProps} />
</MsalProvider>
);
}
Uygulama Yönlendiricisi (app/)
-
Oluşturmak
app/redirect/page.js— Bu bir İstemci Bileşeni olmalıdır ("use client"):
"use client";
import { useEffect } from "react";
import { broadcastResponseToMainFrame } from "@azure/msal-browser/redirect-bridge";
export default function Redirect() {
useEffect(() => {
broadcastResponseToMainFrame().catch((error) => {
console.error("Error broadcasting response to main frame:", error);
});
}, []);
return <p>Processing authentication...</p>;
}
-
Kök düzeninizde yeniden yönlendirme rotasını
MsalProvideröğesinden hariç tutun.app/layout.js, alt öğeleriMsalProvideriçinde sarıyorsa, bunu atlayan yönlendirme rotası için ayrı bir düzen oluşturun:
// app/redirect/layout.js — no MsalProvider wrapper
export default function RedirectLayout({ children }) {
return <>{children}</>;
}
Bu, broadcastResponseToMainFrame() çalıştırılmadan önce MSAL'nin kimlik doğrulama yanıtı hash'ini işlemesini engeller.
İki yönlendirici için de next.config.js hiçbir değişiklik gerekmez — Next.js sayfaları otomatik olarak sunar.
Örnek: Sayfa Yönlendiricisi örneği için nextjs-sample'a bakın.
Express.js / Node.js Arka Ucu
Express.js (veya statik dosyalar sunan herhangi bir Node.js arka ucu) kullanırken, sunucuyu COOP üst bilgileri olmadan yeniden yönlendirme sayfasına hizmet vermek üzere yapılandırın:
const express = require("express");
const path = require("path");
const app = express();
// Serve the redirect bridge page WITHOUT COOP headers
app.get("/redirect", (req, res) => {
res.sendFile(path.join(__dirname, "public", "redirect.html"));
});
// Set COOP headers for all other routes
app.use((req, res, next) => {
res.setHeader("Cross-Origin-Opener-Policy", "same-origin");
next();
});
app.use(express.static(path.join(__dirname, "public")));
Örnek: Bkz. HybridSample.