经过我所有的研究和阅读Microsoft文档,我无法得出如何在outlook web插件中使用身份验证代码流生成访问令牌的结论。在对话API的帮助下,我可以成功地使用隐式授权流生成访问令牌,只需打开URL,我们就可以从地址栏中读取访问令牌。
为了更安全,我正在尝试使用azure中的注册应用程序生成访问令牌,以使用auth代码流来绘制API/(自定义SharePoint网站(。
Azure应用程序设置:在Microsoft Graph下添加了API权限。[User.Read,Sites.Read.All]重定向Web URI:myapp/Auth_Result重定向SPA URI:myapp/Auth_Result_SPA
Outlook Web加载项中的代码:
使用对话框API打开myapp/Auth页面,该页面重定向到
https://login.microsoftonline.com/<Tenant ID>/oauth2/v2.0/authorize
?client_id=<Client ID>
&response_type=code
&redirect_uri=https%3A%2F%2Flocalhost%3A44333%2FAuth_result.html
&response_mode=query&scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read
&state=12345
上述URL在被读取的重定向页面myapp/Auth_result中生成授权代码。
Auth_Result页面中的代码
function GetAccessToken(authCode) {
try {
var url = 'https://login.microsoftonline.com/<Tenant ID>/oauth2/v2.0/token';
var params = 'client_id=<Client ID>&scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read&code=' + authCode + '&redirect_uri=https://localhost:44333/Auth_Result_SPA.html&grant_type=authorization_code';
var xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function (result) {
AccessTokenCallback(result);
}
xhr.send(params);
}
catch{ }
}
的上述请求失败
Access to XMLHttpRequest at 'https://login.microsoftonline.com/<Tenant ID>/oauth2/v2.0/token' from origin 'https://localhost:44333' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
MessageRead.js:780 POST https://login.microsoftonline.com/<Tenant ID>/oauth2/v2.0/token net::ERR_FAILED
清单中的应用程序域
<AppDomain>https://login.microsoftonline.com/<Tenant ID>/oauth2/v2.0/token</AppDomain>
<AppDomain>https://login.microsoftonline.com</AppDomain>
<AppDomain>https://localhost:44333</AppDomain>
<AppDomain>https://localhost:44333/Auth</AppDomain>
<AppDomain>https://localhost:44333/Auth_Result</AppDomain>
<AppDomain>https://localhost:44333/Auth_Result_SPA</AppDomain>
<AppDomain>https://graph.microsoft.com</AppDomain>
我不确定我错过了什么?现在我在质疑在outlook web插件中使用auth代码流是否可能?
伙计们,任何建议都会有帮助。
感谢
------编辑---------------
我尝试了上面的解决方案,将重定向URI作为Web平台。
如果我在azure应用程序身份验证中使用SPA平台重定向URI,那么我会得到以下错误:
由于某种原因,图像并没有出现。错误文本:
AADSTS9002325:跨来源授权代码兑换需要代码交换的证明密钥。
[![enter image description here][1]][1]
看起来直接的问题是,您的Azure AD客户端需要是一个单页应用程序,如我文章的第6步所述,这样您就可以克服CORS错误。
桌面流量
我相信您是在桌面应用程序(Outlook(的上下文中操作的。如果是这样的话,那么官方的OAuth选项将使用以下成分:
- 授权代码流(PKCE(
- 使用系统浏览器登录
- 监听环回url上的响应,例如http://localhost:8000
有关此的示例,请参阅我的桌面教程+代码示例
感谢您的回复,我成功地使用auth代码流生成了访问令牌。事实证明,我没有提供代码挑战,也没有完全理解身份验证的流程,尤其是对于Outlook web插件。
解决方案就在这里。使此解决方案发挥作用的要求。
- 替换:<租户ID>=Azure应用程序注册中的租户id
- 替换:<客户端ID>=Azure应用程序注册中的客户端id
- Sethttps://localhost:44300/Auth_Result_SPA作为身份验证中的重定向URI->SPA平台
- 将作用域设置为您的要求,并确保在Azure中注册应用程序后在API权限中添加作用域
- 在visual studio中加载项目时,请确保应用程序url匹配。app-url=TestGraphWeb项目属性中的SSL url
参考:
- 参考此生成代码质询和代码验证器
- 有关身份验证代码流信息,请参阅
这是应用程序名称为"的Outlook web插件示例;TestGraph";。当应用程序加载到任务窗格中时,它将使用Auth代码流生成访问令牌。如果需要用户操作来生成身份验证代码,则此应用程序将弹出对话框。在生成访问令牌之后,它将仅用按钮"加载页面;刷新访问令牌";其将生成新的访问令牌和刷新令牌。