如何在Ionic React中实现Azure Active Directory / MSAL,以便在原生Android中运行应用程序时工作

hof1towb  于 2023-05-05  发布在  Ionic
关注(0)|答案(1)|浏览(133)

我已经成功地在我的离子React电容器应用程序中实现了AAD身份验证。当我通过运行ionic serve在web中运行应用程序时,它工作得完美无缺。
但是当在Android上运行应用程序时,当我按下登录按钮时,我不会被重定向到应用程序,也不会设置任何凭据。
我得到的redirectUri在下面的屏幕截图是不正确的,只有在网络运行时,但我已经尝试使用重定向URI的'移动的和桌面应用程序'和'Android'平台在Azure的活动目录,我也不能得到工作。
My component
My PCA
1.我已经尝试使用几个不同的重定向URI,并期望其中一个实际上重定向回应用程序。
1.我尝试使用应用程序浏览器,但无法在应用程序浏览器中打开msal示例loginRedirect函数。

xqkwcwgp

xqkwcwgp1#

我通过使用Cordova的InAppBrowser插件(@awesome-cordova-plugins/in-app-browser)和msal的NavigationClient的自定义实现(@azure/msal-browser)解决了这个问题。
实现如下所示:

import { InAppBrowser } from "@awesome-cordova-plugins/in-app-browser";
import type { IPublicClientApplication } from "@azure/msal-browser";
import { NavigationClient } from "@azure/msal-browser";
import { Capacitor } from "@capacitor/core";

export class NavigationAuthenticationClient extends NavigationClient {
  constructor(private msalInstance: IPublicClientApplication) {
    super();
  }

  async navigateExternal(url: string, options: any): Promise<boolean> {
    if (Capacitor.isNativePlatform()) {
      const browser = InAppBrowser.create(url, "_blank", {
        location: "yes",
        hidenavigationbuttons: "yes",
        clearcache: "yes",
        clearsessioncache: "yes",
        hideurlbar: "yes",
        fullscreen: "yes",
      });
      browser.on("loadstart").subscribe((event: any) => {
        if (event.url.includes("#code")) {
          browser.close();
          const domain = event.url.split("#")[0];
          const url = event.url.replace(domain, "http://localhost/home");

          this.msalInstance
            .handleRedirectPromise(url)
            .then((res) => {
              console.log(res?.account?.name + " has authenticated");
            })
            .catch((err) => {
              console.log(err);
            });
        }
      });
    } else {
      if (options.noHistory) {
        window.location.replace(url);
      } else {
        window.location.assign(url);
      }
    }
    return true;
  }
}

我扩展了LoginButton的代码,首先在msal示例中设置了新的自定义NavigationClient:

import { useMsal } from "@azure/msal-react";
import { IonFabButton, IonIcon } from "@ionic/react";
import { personOutline } from "ionicons/icons";
import { useEffect } from "react";
import { NavigationAuthenticationClient } from "../NavigationAuthenticationClient";

const LoginButton: React.FC = (): JSX.Element => {
  const { instance } = useMsal();

  useEffect(() => {
    instance.setNavigationClient(new NavigationAuthenticationClient(instance));
  }, []);

  const handleSignIn = async () => {
    await instance.loginRedirect({
      scopes: ["..."],
    });
  };

  return (
    <IonFabButton onClick={handleSignIn} id="navigation_button">
      <IonIcon size="small" icon={personOutline}></IonIcon>
    </IonFabButton>
  );
};

export default LoginButton;

相关问题