我正在尝试使用MSAL为我的单页应用程序添加SSO,目的是为了获取Oauth2令牌以用于解决Microsoft SaaS订阅。我已基于以下示例存储库配置了我的代码:https://github.com/Azure-Samples/ms-identity-javascript-v2。它使用的是MSAL 2.0,而不是1.X版本。
这是相关的代码段,在/signup
页上运行:
var config = {
auth: {
clientId: <MY_CLIENT_ID>,
authority: "https://login.microsoftonline.com/common",
redirectUri: <APP_URL> + "/signup",
},
cache: {
cacheLocation: "sessionStorage",
storeAuthStateInCookie: false,
}
};
var msalInstance = new msal.PublicClientApplication(config);
msalInstance.loginPopup(["openid", "profile", "User.Read"]).then((response) => {
console.log(response)
}).catch(error => {
console.error(error);
});
在应用程序中调用此代码,我成功使用弹出窗口登录,但出现以下错误:ServerError: invalid_client: 70002 - [2020-09-03 16:55:35Z]: AADSTS70002: The provided request must include a 'client_secret' input parameter.
我可以看到具有以下表单数据的基础网络呼叫是https://login.microsoftonline.com/common/oauth2/v2.0/token
:
client_id: <MY_CLIENT_ID>
redirect_uri: <APP_URL>/signup
scope: openid profile
code: <some value>
code_verifier: <some value>
grant_type: authorization_code
client_info: 1
client-request-id: <some value>
根据此处https://docs.microsoft.com/en-us/advertising/guides/authentication-oauth-identity-platform?view=bingads-13#request-accesstoken的文档,此调用应具有可配置的client_secret
参数,这会导致我相信的错误。
我在Azure门户上的应用程序中具有必需的客户端密码。我的问题是,如何在config
对象中配置客户端密码?我无法在线找到任何示例,也尝试盲目在配置中的clientSecret
下添加auth
作为键,但这没有将其传递给login.microsoftonline.com
调用。 / p>
更新
进一步研究之后,我意识到设置的根本问题是我试图使用authorization grant flow来请求令牌,但需要使用client credentials flow。将令牌获取移至后端(并在此处使用客户端机密)后,在this followup thread中获得了更多帮助,我能够按预期运行SSO和令牌获取。
答案 0 :(得分:0)
我们已经调试了您的示例,并且可以正常使用。经过测试,我们认为该问题正在发生,这是因为您的代码无法在'/authPopup.js'中调用Signin()方法。如果在index.html中发生此方法调用,您将不会遇到任何问题。
答案 1 :(得分:0)
考虑直接使用Teams中的新SSO功能,而不是直接使用MSAL,它可以为您带来很多好处,并且更易于使用。这是overview,这是working sample。
关于示例,它在节点中,并且我正在研究该示例的dotnet版本。看来您使用的是节点,所以您应该参考原始文档,但是我认为我发现了一些错误,因此,如果遇到任何问题,您可以查看我版本中的客户端脚本-请参阅here
答案 2 :(得分:0)