msal.js 包的 loginRedirect() 方法导致“TypeError:无法读取未定义的属性“then””

4 javascript azure-ad-msal microsoft-teams msal.js microsoft-graph-teams

我目前正在使用 msal.js 包,以便您可以对我自己的 Vue.js 应用程序使用 azure 授权。到目前为止,我已经创建了一个 Teams 应用程序,可以在其中访问我的 Vue.js 网站,该网站通过 ngrok 建立隧道。

我在 Vue.js 中的代码如下所示(为了安全起见,我在这篇 stackoverflow 帖子中用占位符替换了 clientId 和authority):

import * as Msal from 'msal';

export default {
  signIn: async () => {

    const aDConfig = {
      auth: {
        clientId: 'AZUREAPPID',
        authority: 'https://login.microsoftonline.com/AZURETENANTID',
        redirectUri: 'https://login.microsoftonline.com/common/oauth2/nativeclient',
      },
      cache: {
        cacheLocation: 'localStorage',
        storeAuthStateInCookie: true,
      },
    };

    const aDAuth = new Msal.UserAgentApplication(aDConfig);

    const loginRequest = {
      scopes: ['user.read'],
    };

    await aDAuth.handleRedirectCallback((error, response) => {
      debugger;
      console.log(error);
      console.log(response);
    });

    await aDAuth.loginRedirect(loginRequest).then(async (loginResponse) => {
      console.log(loginResponse);

      debugger;
    }).catch((error) => {
      console.log(error);
    });
  },
};
Run Code Online (Sandbox Code Playgroud)

基本上,它的作用是设置要连接的 azure 应用程序,然后尝试通过 loginRedirect() 方法静默登录。

但是当我尝试运行此代码时,在 loginRedirect() 方法处脚本停止,我会收到错误消息:

在此输入图像描述

由于 loginRequest 不为空,我不确定错误指的是什么。

这里可能有什么问题?

jas*_*ter 6

loginRedirect不返回 Promise(因为它会使用户离开当前页面)。如果要处理重定向的结果,则需要实现adAuth.handleRedirectCallback(callback)(这应该在实例化后立即在页面加载时完成adAuth),当 Msal 检测到从重定向流返回后正在加载页面时,将调用该方法。

请参阅: https: //github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-core/README.md#1-instantiate-the-useragentapplication

编辑:误读了您的代码,我发现您已经这样做了。所以只要脱掉.thenloginRedirect可以了。

另外,handleRedirectCallback不会返回 Promise,所以你不应该await这样做。signIn您需要实例化 Msal 并在函数外部(例如在页面加载时)实现回调。

import * as Msal from 'msal';

const aDConfig = {
    auth: {
      clientId: 'AZUREAPPID',
      authority: 'https://login.microsoftonline.com/AZURETENANTID',
      redirectUri: 'https://login.microsoftonline.com/common/oauth2/nativeclient',
    },
    cache: {
      cacheLocation: 'localStorage',
      storeAuthStateInCookie: true,
    }
};

const aDAuth = new Msal.UserAgentApplication(aDConfig);

const loginRequest = {
    scopes: ['user.read']
};

aDAuth.handleRedirectCallback((error, response) => {
    debugger;
    console.log(error);
    console.log(response);
});


export default {
  signIn: async () => {
    aDAuth.loginRedirect(loginRequest);
  }
};
Run Code Online (Sandbox Code Playgroud)