如何使用 ajax 调用获取 Microsoft Graph API 访问令牌
How to get Microsoft Graph API Access token using ajax call
我在 SharePoint Online 页面上使用 Microsoft Graph API 从 Outlook 日历中获取用户事件。我正在使用 ADAL.JS。当我转到该页面时,该页面重定向到 MS 登录以从 Azure AD 获取访问令牌并再次返回页面。
我尝试使用 ajax 调用获取访问令牌,但令牌不起作用。我试图在另一个页面的 iFrame 中调用该页面,但它在 iFrame 中不起作用。
谁能建议我是否可以在后台获取访问令牌,这样页面就不会重定向到 Microsoft 登录。
我们尝试了下面的代码,但它给出了 "No mailbox was found that includes the specified identity: xxxxxxx"
的错误
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
requestToken();
});
var token;
function requestToken() {
$.ajax({
"async": true,
"crossDomain": true,
"url": "https://cors-anywhere.herokuapp.com/https://login.microsoftonline.com/tenantname.onmicrosoft.com/oauth2/v2.0/token", // Pass your tenant name instead of tenantname
"method": "POST",
"headers": {
"content-type": "application/x-www-form-urlencoded"
},
"data": {
"grant_type": "client_credentials",
"client_id": "****************************", //Provide your app id
"client_secret": "******************", //Provide your client secret
"scope": "https://graph.microsoft.com/.default"
},
success: function(response) {
console.log(response);
token = response.access_token;
document.getElementById('content').innerHTML = token;
}
})
}
</script>
<p id="content"></p>
谢谢,
当我在我的在线环境中测试它时,请遵循 this thread, the request fail as it require user consent(official guideline)。
所以我授予应用程序应用程序权限,并在管理员同意的情况下由管理员批准 url(https://login.microsoftonline.com/common/adminconsent?client_id=appid&state=12345)
现在,我可以通过以下端点访问日历视图:
https://graph.microsoft.com/v1.0/users/userid/calendarView/delta?startdatetime=2018-12-04T12:11:08Z&enddatetime=2019-01-04T12:11:08Z
我的测试代码:
<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script type="text/javascript">
$(document).ready(function () {
requestToken();
});
var token;
function requestToken() {
$.ajax({
"async": true,
"crossDomain": true,
"url": "https://cors-anywhere.herokuapp.com/https://login.microsoftonline.com/tenant.onmicrosoft.com/oauth2/v2.0/token", // Pass your tenant name instead of sharepointtechie
"method": "POST",
"headers": {
"content-type": "application/x-www-form-urlencoded"
},
"data": {
"grant_type": "client_credentials",
"client_id ": "xxx", //Provide your app id
"client_secret": "xxx", //Provide your client secret genereated from your app
"scope ": "https://graph.microsoft.com/.default"
},
success: function (response) {
console.log(response);
token = response.access_token;
document.getElementById('content').innerHTML = token;
$.ajax({
url: 'https://graph.microsoft.com/v1.0/users/userid/calendarView/delta?startdatetime=2018-12-04T12:11:08Z&enddatetime=2019-01-04T12:11:08Z',
type: 'GET',
dataType: 'json',
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Bearer '+token+'');
},
data: {},
success: function (results) {
console.log(response);
debugger;
},
error: function (error) {
console.log("Error in getting data: " + error);
}
});
}
})
}
</script>
感谢您的解决方案。我现在能够得到它。
如果我可以使用相同的不记名令牌获得 outlook 任务,请告诉我。
我通过以下 URL 进行了相同的尝试。
https://graph.microsoft.com/beta/me/outlook/tasks
但是访问被拒绝错误。
我也试过了
https://graph.microsoft.com/v1.0/users/userid/outlook/tasks
但是它说 "Bad request"
我在 SharePoint Online 页面上使用 Microsoft Graph API 从 Outlook 日历中获取用户事件。我正在使用 ADAL.JS。当我转到该页面时,该页面重定向到 MS 登录以从 Azure AD 获取访问令牌并再次返回页面。
我尝试使用 ajax 调用获取访问令牌,但令牌不起作用。我试图在另一个页面的 iFrame 中调用该页面,但它在 iFrame 中不起作用。
谁能建议我是否可以在后台获取访问令牌,这样页面就不会重定向到 Microsoft 登录。
我们尝试了下面的代码,但它给出了 "No mailbox was found that includes the specified identity: xxxxxxx"
的错误 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
requestToken();
});
var token;
function requestToken() {
$.ajax({
"async": true,
"crossDomain": true,
"url": "https://cors-anywhere.herokuapp.com/https://login.microsoftonline.com/tenantname.onmicrosoft.com/oauth2/v2.0/token", // Pass your tenant name instead of tenantname
"method": "POST",
"headers": {
"content-type": "application/x-www-form-urlencoded"
},
"data": {
"grant_type": "client_credentials",
"client_id": "****************************", //Provide your app id
"client_secret": "******************", //Provide your client secret
"scope": "https://graph.microsoft.com/.default"
},
success: function(response) {
console.log(response);
token = response.access_token;
document.getElementById('content').innerHTML = token;
}
})
}
</script>
<p id="content"></p>
谢谢,
当我在我的在线环境中测试它时,请遵循 this thread, the request fail as it require user consent(official guideline)。
所以我授予应用程序应用程序权限,并在管理员同意的情况下由管理员批准 url(https://login.microsoftonline.com/common/adminconsent?client_id=appid&state=12345)
现在,我可以通过以下端点访问日历视图:
https://graph.microsoft.com/v1.0/users/userid/calendarView/delta?startdatetime=2018-12-04T12:11:08Z&enddatetime=2019-01-04T12:11:08Z
我的测试代码:
<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script type="text/javascript">
$(document).ready(function () {
requestToken();
});
var token;
function requestToken() {
$.ajax({
"async": true,
"crossDomain": true,
"url": "https://cors-anywhere.herokuapp.com/https://login.microsoftonline.com/tenant.onmicrosoft.com/oauth2/v2.0/token", // Pass your tenant name instead of sharepointtechie
"method": "POST",
"headers": {
"content-type": "application/x-www-form-urlencoded"
},
"data": {
"grant_type": "client_credentials",
"client_id ": "xxx", //Provide your app id
"client_secret": "xxx", //Provide your client secret genereated from your app
"scope ": "https://graph.microsoft.com/.default"
},
success: function (response) {
console.log(response);
token = response.access_token;
document.getElementById('content').innerHTML = token;
$.ajax({
url: 'https://graph.microsoft.com/v1.0/users/userid/calendarView/delta?startdatetime=2018-12-04T12:11:08Z&enddatetime=2019-01-04T12:11:08Z',
type: 'GET',
dataType: 'json',
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Bearer '+token+'');
},
data: {},
success: function (results) {
console.log(response);
debugger;
},
error: function (error) {
console.log("Error in getting data: " + error);
}
});
}
})
}
</script>
感谢您的解决方案。我现在能够得到它。 如果我可以使用相同的不记名令牌获得 outlook 任务,请告诉我。 我通过以下 URL 进行了相同的尝试。
https://graph.microsoft.com/beta/me/outlook/tasks
但是访问被拒绝错误。
我也试过了
https://graph.microsoft.com/v1.0/users/userid/outlook/tasks
但是它说 "Bad request"