- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景我正在开发一个移动应用程序,它通过 Azure Active Directory(Microsoft 身份验证)进行身份验证,并可以访问 Sharepoint 中的一些信息。我的第一选择是使用 Ionic Cordova,但似乎不支持 Cordova-MSAL 集成。因此我们选择了 Xamarin,以开发跨平台应用程序,但兼容 Microsoft 身份验证。
情况我正在尝试连接 Sharepoint API。
1- 我已在 Azure (Active Directory) 中注册了一个新应用程序,并且 给予的权限。
2-我通过 MSAL 获取不记名 token 库(在网络和 Xamarin 中),在我自己登录后(例如 链接如下): https://learn.microsoft.com/es-es/azure/active-directory/develop/quickstart-v2-javascript
3- 现在我向 Sharepoint API 发出以下请求。
url: http://site url/_api/web/lists(guid'list GUID'),
method: GET
Headers:
Authorization: "Bearer " + accessToken
accept: "application/json;odata=verbose"
但我总是收到以下错误:
{"error_description":"Invalid JWT token. No certificate thumbprint specified in token header."}
我读到很多人都在谈论 MSAL 的错误,但这是官方方式(ADAL 看起来即将被弃用)。
任何想法都会受到赞赏,非常感谢。
最佳答案
在利用 MSAL.js 进行身份验证并获取访问 token 以成功调用 SharePoint Online API 时,我也遇到了这个问题。
Microsoft 的以下文档提供了通过 MSAL 进行身份验证的精彩示例和说明:https://learn.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa
但是,我需要继续利用获取的 token 直接调用 SharePoint API,而不是通过 Graph API 使用服务。
为了解决这个问题,我必须按如下方式定义我的范围:
scopes: [https://{tenantName}.sharepoint.com/.default]
使用 Microsoft 文章中的示例,我进行了必要的更改。我能够利用获取的访问 token 成功调用 SharePoint API:
<!DOCTYPE html>
<html>
<head>
<title>Quickstart for MSAL JS</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.4/bluebird.min.js"></script>
<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.0/js/msal.js">
</script>
</head>
<body>
<h2>Welcome to MSAL.js Quickstart</h2><br />
<h4 id="WelcomeMessage"></h4>
<button id="SignIn" onclick="signIn()">Sign In</button><br /><br />
<pre id="json"></pre>
<script>
var msalConfig = {
auth: {
clientId: "{clientID}",
authority: "https://login.microsoftonline.com/organizations"
},
cache: {
cacheLocation: "localStorage",
storeAuthStateInCookie: true
}
};
var sharePointConfig = {
sharePointFileEndpoint: "https://{tenantName}.sharepoint.com/sites/{siteName}/_api/web/GetFolderByServerRelativeUrl('Shared Documents/{folderName}')/Files('testFile.txt')/$value"
}
//the defined scopes were updated for making calls to the SharePoint API.
var requestObj = {
scopes: ["https://{tenantName}.sharepoint.com/.default"]
};
var myMSALObj = new Msal.UserAgentApplication(msalConfig);
// Register Callbacks for redirect flow
myMSALObj.handleRedirectCallback(authRedirectCallBack);
function signIn() {
myMSALObj.loginPopup(requestObj).then(function (loginResponse) {
//Login Success
showWelcomeMessage();
acquireTokenPopupAndCallAPI();
}).catch(function (error) {
console.log(error);
});
}
function acquireTokenPopupAndCallAPI() {
//Always start with acquireTokenSilent to obtain a token in the signed in user from cache
myMSALObj.acquireTokenSilent(requestObj).then(function (tokenResponse) {
//Http Request
callAPI(sharePointConfig.sharePointFileEndpoint, tokenResponse.accessToken, graphAPICallback);
}).catch(function (error) {
console.log(error);
// Upon acquireTokenSilent failure (due to consent or interaction or login required ONLY)
// Call acquireTokenPopup(popup window)
if (requiresInteraction(error.errorCode)) {
myMSALObj.acquireTokenPopup(requestObj).then(function (tokenResponse) {
//Http Request
callAPI(sharePointConfig.sharePointFileEndpoint, tokenResponse.accessToken, graphAPICallback);
}).catch(function (error) {
console.log(error);
});
}
});
}
function graphAPICallback(data) {
document.getElementById("json").innerHTML = JSON.stringify(data, null, 2);
}
function showWelcomeMessage() {
var divWelcome = document.getElementById('WelcomeMessage');
divWelcome.innerHTML = 'Welcome ' + myMSALObj.getAccount().userName + "to Microsoft Graph API";
var loginbutton = document.getElementById('SignIn');
loginbutton.innerHTML = 'Sign Out';
loginbutton.setAttribute('onclick', 'signOut();');
}
function authRedirectCallBack(error, response) {
if (error) {
console.log(error);
}
else {
if (response.tokenType === "access_token") {
callAPI(sharePointConfig.sharePointFileEndpoint, tokenResponse.accessToken, graphAPICallback);
} else {
console.log("token type is:" + response.tokenType);
}
}
}
function requiresInteraction(errorCode) {
if (!errorCode || !errorCode.length) {
return false;
}
return errorCode === "consent_required" ||
errorCode === "interaction_required" ||
errorCode === "login_required";
}
// Browser check variables
var ua = window.navigator.userAgent;
var msie = ua.indexOf('MSIE ');
var msie11 = ua.indexOf('Trident/');
var msedge = ua.indexOf('Edge/');
var isIE = msie > 0 || msie11 > 0;
var isEdge = msedge > 0;
//If you support IE, our recommendation is that you sign-in using Redirect APIs
//If you as a developer are testing using Edge InPrivate mode, please add "isEdge" to the if check
// can change this to default an experience outside browser use
var loginType = isIE ? "REDIRECT" : "POPUP";
if (loginType === 'POPUP') {
if (myMSALObj.getAccount()) {// avoid duplicate code execution on page load in case of iframe and popup window.
showWelcomeMessage();
acquireTokenPopupAndCallAPI();
}
}
else if (loginType === 'REDIRECT') {
document.getElementById("SignIn").onclick = function () {
myMSALObj.loginRedirect(requestObj);
};
if (myMSALObj.getAccount() && !myMSALObj.isCallback(window.location.hash)) {// avoid duplicate code execution on page load in case of iframe and popup window.
showWelcomeMessage();
acquireTokenPopupAndCallAPI();
}
} else {
console.error('Please set a valid login type');
}
function callAPI(theUrl, accessToken, callback) {
var xmlHttp = new XMLHttpRequest();
/*
xmlHttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200)
callback(JSON.parse(this.responseText));
}
*/
xmlHttp.open("GET", theUrl, true); // true for asynchronous
xmlHttp.setRequestHeader('Authorization', 'Bearer ' + accessToken);
xmlHttp.send();
}
function signOut() {
myMSALObj.logout();
}
</script>
</body>
</html>
上面的示例是 Microsoft 示例的修改版本。我能够利用它来成功进行测试。
关于azure - Sharepoint API 中使用 MSAL token 发出未经授权的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58415404/
我从 GitHub 下载了示例以试验 Azure AD B2C https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-
为了在我的 JavaScript 代码中使用 MSAL 获取访问 token ,我拼凑了大量教程和文档。这是我的研究结果。 最佳答案 npm 安装@azure/msal 从@azure/msal 导入
我正在编写一个 Chrome 扩展程序,它需要访问需要 AAD 访问 token 的 ASP.NET Core Web API。我正在尝试使用 msal NPM 包提供身份验证流程,以便用户可以使用他
我没有从使用 MSAL 库的 UserAgentApplication 实例的 loginPopup(requestObj) 获得 loginResponse。 Azure 示例用作 https://
我对 OAuth2 以及 AccessToken 和 RefreshToken 的概念比较熟悉。 看起来 MSAL 在使用 ClientApplicationBase.AcquireTokenSile
我使用了 msal.js 文件(版本 1.0.3),但是没有调用 authCallback 函数, var clientApplication = new Msal.UserAgentApplicat
Dynamics 365 的门户功能提供了使用 Azure AD B2C 登录的功能。这是我对其控制能力有限的产品功能,据我所知,该功能是在没有 MSAL 的情况下实现的。 在门户上下文中,我尝试使用
我正在尝试遵循 Microsoft active-directory 的教程 将客户端 ID 和 key 输入代码并运行代码后,它会将我带到登录页面,我使用凭据登录,但出现以下错误: "errorCo
我正在尝试遵循 Microsoft active-directory 的教程 将客户端 ID 和 key 输入代码并运行代码后,它会将我带到登录页面,我使用凭据登录,但出现以下错误: "errorCo
我正在尝试使用 Azure MSAL 浏览器 js CDN 将对象初始化为 PublicClientApplication。但我发现 Msal 未定义。 CDN:https://alcdn.msaut
我尝试使用此处提供的代码:https://github.com/Azure-Samples/active-directory-javascript-singlepageapp-dotnet-webap
@azure/msal-browser 2.14.1@azure/msal-react 1.0.0-beta.2 我们正在使用自定义 B2C 政策 当我使用 PublicClientApplicati
我有一个使用 msal 0.1.2 的 angular7 应用程序。用户间歇性地无法访问任何需要身份验证的内容,当您查看开发人员工具网络选项卡时,您可以看到一个 GET 请求来获取 https://l
@azure/msal-browser 2.14.1@azure/msal-react 1.0.0-beta.2 我们正在使用自定义 B2C 政策 当我使用 PublicClientApplicati
我想使用应用程序 ID 和 secret 对 AAD 用户进行身份验证,以通过 MSAL 访问 powerBi 资源。所以我想获取访问 token 并将其缓存在 SQL Db 中。 经历了 docum
我尝试包含 Azure AD 进行登录,但在运行 npm install @azure/msal-browser @azure/msal-angular 以及 npm install @azure/m
我尝试包含 Azure AD 进行登录,但在运行 npm install @azure/msal-browser @azure/msal-angular 以及 npm install @azure/m
我想安装 @azure/msal-angular 以使用 Angular 作为前端来使用 azure B2C 身份验证,但是当我尝试安装该包时,它给了我一个错误 npm ERR! code E
我想安装 @azure/msal-angular 以使用 Angular 作为前端来使用 azure B2C 身份验证,但是当我尝试安装该包时,它给了我一个错误 npm ERR! code E
使用msal.js库(Microsoft身份验证库),可以通过哪种方法知道给定用户是否已经登录?我的意图是如果用户的凭据已经保存在浏览器的存储中,则避免显示登录弹出窗口 我目前的做法: functio
我是一名优秀的程序员,十分优秀!