我不讨厌Oauth,但我讨厌自己无法绕过这个概念.话虽如此,这是我的问题:我试图从vanilla javascript调用Office Graph REST api.所以我正在从我的SharePoint Online站点上运行的页面中对graph.microsoft.com进行常规XMLHttpRequest(因此,当我登录时,代码应该从我的安全上下文运行).该调用返回403 Authentication Required.我假设我必须在Azure AD中注册一个应用程序,我已经这样做了,所以我有一个客户端ID和一个秘密.但是,我无法以编程方式找到下一步该做什么(我想我理解了这个概念,我必须得到一个在调用Graph api时必须提供的令牌).除了javascript之外,似乎有大量的示例代码几乎可以用于任何事情.有人有指针吗?
更新:
我知道令牌的介入,这是我无法绕过的部分(见原始问题/评论);我有一个客户端ID,我有一个秘密,我有这个(非常常见)代码:
function graphRead(whatToRead) {
switch(whatToRead) {
case "userinfo" :
officeUser = JSON.Parse(loadXMLDoc("GET","https://graph.microsoft.com/v1.0/me"));
break;
default:
};
};
function loadXMLDoc(mMethod,uURL) {
var xmlhttp;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE ) {
if(xmlhttp.status == 200){
return(xmlhttp.responseText);
}
else if(xmlhttp.status == 400) {
alert('There was an error 400')
}
else {
alert('something else other than 200 was returned')
}
}
};
xmlhttp.open(mMethod, uURL, true);
xmlhttp.send();
};
问题是:我需要做什么才能建立令牌并将其发送到API?
解决方法:
如果您在JavaScript中使用所有客户端,那么您可能希望实现所谓的“隐式授权”流程. Azure在这里写了一个流程:https://azure.microsoft.com/en-us/documentation/articles/active-directory-v2-protocols-implicit/.
基本上,您的页面要么具有“登录”链接,要么自动浏览到Azure授权页面,其中所有参数都编码到URL中,如客户端ID和要求图表的范围.如果需要,用户必须登录,但在您的情况下,他们可能不必.一旦用户使用他们的凭据登录(再次,如果需要),他们将被要求同意允许您的应用访问他们的数据.假设他们说是,Azure将使用查询哈希中的访问令牌重定向回您的页面.您需要在那里使用JS代码从哈希中提取访问令牌.例如,重定向看起来像:
https://localhost/myapp/#
access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
&token_type=Bearer
&expires_in=3599
&scope=https%3a%2f%2fgraph.microsoft.com%2fmail.read
&id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
&state=12345
伪步骤
>在页面加载时,检查URL片段中是否已存在访问令牌.
>如果是,则表示您在授权重定向后加载,并且您可以继续进行图表调用.
>如果不是,则需要提示用户或自动重定向到授权端点.
>调用Graph时,需要在Authorization http标头中传递令牌.您可以通过在代码中添加以下行(发送之前)来执行此操作:xmlhttp.setRequestHeader(“授权”,“承载”令牌);
但为什么我必须这样做?
答案是OAuth只是作为应用程序运行,而不是以用户身份运行.因此,作为用户进行身份验证的旧版本模型不适用.用户必须向应用授予访问其数据的权限.
所以真正发生的事情不是应用程序必须“再次作为用户身份验证”,它必须作为自己的身份验证!这就是你的所作所为(通过提供你的客户ID).作为该过程的一部分,用户可能必须登录以确认其身份,然后提供同意.
在隐式流程中根本不会使用您的客户端密钥.基本上,您的应用程序将“证明”它本身就是使用客户端ID并出现在您注册为应用注册的一部分的URL中.
标签:javascript,office365 来源: https://codeday.me/bug/20190519/1135077.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。