从microsoft graph/token使用javascript/reactjs使用客户端凭据获取访问令牌时出现CORS问题?

从microsoft graph/token使用javascript/reactjs使用客户端凭据获取访问令牌时出现CORS问题?,javascript,oauth,cors,fetch,microsoft-graph-api,Javascript,Oauth,Cors,Fetch,Microsoft Graph Api,我需要使用fetch()方法获取访问令牌,但无法使用fetch()方法。尝试将Cors策略或交叉访问源代码分配给所有人,但似乎什么都不起作用 在获取时访问'https://login.microsoftonline.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxx/common/oauth2/v2.0/token“起源”http://localhost:3050'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origin'标头。如果不透明响应

我需要使用fetch()方法获取访问令牌,但无法使用fetch()方法。尝试将Cors策略或交叉访问源代码分配给所有人,但似乎什么都不起作用

在获取时访问'https://login.microsoftonline.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxx/common/oauth2/v2.0/token“起源”http://localhost:3050'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origin'标头。如果不透明响应满足您的需要,请将请求的模式设置为“无cors”,以获取禁用cors的资源。

graphService.ts:81 POST/common/oauth2/v2.0/token net::ERR_失败


提前感谢:)

您收到了cors错误,因为当您使用客户端凭据时,Azure AD在包含源站标题时拒绝了请求。首先,您正在以错误的方式使用客户端凭据。 考虑通过阅读客户端证书流来帮助您理解为什么它首选服务器端/守护进程应用程序。 要查看错误,只需将Origin头添加到postman,然后再次执行请求

也请阅读以了解您可以使用的oauth2流


对于您的情况,您可以使用,因为您有一个SPA。

导致问题的不是流程或配置。真正的问题是前端或SPA。如果您想调用API来获取带有客户端凭据流的令牌,那么必须遵循这两种方法中的任何一种,我想这是必须的

1.守护进程服务

2.服务器端实现

我用Node调用了API,配置与文档中提到的相同,现在可以正常工作了。 msal节点npm包是调用api的替代方法,也可以自己调用图形api

异步getAppTokenFromAzureAD():承诺{ const requestHeaders:HeadersInit=newheaders(); 变量详细信息={ “客户机密”:“xxxxxxxxxxxxxxxxxxxxxx”, '客户id':'xxxxxxxxxxxxxxxxxxxxxxxxxxxx', '范围':'https://graph.microsoft.com/.default', “授予类型”:“客户端凭据” }; 让formBody:any=[]; for(var属性详细信息){ var encodedKey=encodeURIComponent(属性); var encodedValue=encodeURIComponent(详细信息[属性]); formBody.push(encodedKey+“=”+encodedValue); } formBody=formBody.join(&); set('Content-Type','application/x-www-form-urlencoded'); set('Host','login.microsoftonline.com'); 返回新承诺((解决、拒绝)=>{ this.connection.transaction(异步(entityManager)=>{ 试一试{ 让tokenResponse=fetch('https://login.microsoftonline.com/xxxxxxxxxxxxxxxxxxxx9/oauth2/v2.0/token',{ 方法:“POST”, headers:requestHeaders, 正文:格式正文 }) 然后(data=>data.json())。然后(responses=>{ 决心({ statusMessage:getMessageByKey('APApplicationTokenSuccess'), 响应, }) }).catch(错误=>{ 拒绝(错误); }) }捕获(错误){ 拒绝(错误) } }) }) }