如何使用 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"