Microsoft 从 oauth2 问题登录

IT技术 azure reactjs login oauth-2.0 axios
2021-05-23 11:31:09

我有一个使用axios库来处理请求的 React 应用程序所以接下来的帖子:

如何使用 OAuth2 和 microsoft login 和 HTTP 请求使用用户名/密码登录

我可以在 Postman 上执行操作。

然后我设置了 axios 库来执行 POST

const dataForBody = `${'grant_type=password&' +
      'username='}${encodeURI(userName)}&` +
      `password=${encodeURI(userPassword)}&` +
      `client_id=${encodeURI(clientID)}&` +
      `resource=${encodeURI('https://graph.microsoft.com')}&` +
      `client_secret=${encodeURI(clientSecret)}`;
const messageHeaders = {
  'Content-Type': 'application/x-www-form-urlencoded'
};

axios({
  method: 'post',
  url: 'https://login.microsoftonline.com/{tenant}/oauth2/token',
  headers: messageHeaders,
  data: dataForBody,
})
  .then((response) => {

  });

但我收到以下错误:

跨域请求被阻止:同源策略不允许读取https://login.microsoftonline.com/{tenant}/oauth2/token 上的远程资源 (原因:缺少 CORS 标头“Access-Control-Allow-Origin”)。

我尝试添加:

'Access-Control-Allow-Origin': 'https://login.microsoftonline.com',

到标题,但它没有用。

所以添加Allow-Control-Allow-Origin: *​​​chrome 扩展解决了我的问题。

问题是,我的应用程序要发布在 azure 上,所以我在其他网络浏览器上测试了该请求,但没有奏效。所以我不希望我的用户安装扩展。

我的请求有问题吗?为什么邮递员不用设置标题就可以做到?

有没有其他方法可以实现它?

PS:我读过使用adal.js但我不想使用微软的登录屏幕,因为我知道用户和应用程序的通行证,我想避免手动登录。

1个回答

您面临的问题是由于您尝试通过 AJAX 调用令牌端点,由于缺少 CORS 标头,它不会接受。您无法添加它,它从 Azure AD 的响应中丢失。

您需要做的不是从令牌端点获取访问令牌,而是必须使用 OAuth 隐式授予流程。此流程允许您在授权阶段直接获取令牌,并且专为基于 JavaScript 的应用程序设计。更多信息:https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-dev-understanding-oauth2-implicit-grant

这意味着您不能像现在一样使用密码授予流程,除非您从后端而不是前端进行调用。