0

当我们尝试通过 response_type = form_post 连接到 ADFS 系统时,我们遇到了问题。

我们必须通过 ADFS 为我们的 React 应用程序实现安全性。我们考虑实现 response_mode=form_post 以便 id_token 将作为一个变量返回到我们的应用程序的表单中。我们也采用了这种方法,以确保我们的 id_token 不会暴露在 URL 中。此外,当我们需要来自 ADFS 的额外声明时,唯一的方法是通过 response_mode=form_post 请求。但是如果我们尝试这种方式,我们会在表单 post 中获取 id_token,但我们的 react 应用程序会抛出“Cannot Post”错误,因为应用程序只能通过 GET 呈现。

我们尝试的示例网址如下

https://example.fedservice.com/adfs/oauth2/authorize?response_type=id_token&redirect_uri=https://localhost:4000/&client_id=sample_client_id&nonce=12345&response_mode=form_post

我们希望我们的应用程序获取发布的响应并将其用于身份验证和来自 id_token 的用户信息,而不是告诉“无法发布”错误。我们如何启用它?任何帮助深表感谢。

4

1 回答 1

0

最后我找到了一种可以使用redirect_uri作为我的node-js服务器的方法所以例如从reactapp App.js构造函数我重定向到获取在nodejs层中编写的api说 http://mynodejsserver.com/login

constructor(props: any) {
    super(props)
    let idToken = localStorage.getItem('id_token')
    if (!idToken) {
      idToken = getCookie('idToken')
    }
    if (idToken) {
      localStorage.setItem('id_token', idToken)
    } else {
      window.location.href = `http://mynodejsserver.com/login?url=${window.location
        .pathname + window.location.search}`
    }
    this.state = {
      idToken,
    }
  }

在 nodejs 服务器中,在 login get api 中,我们将其重定向到 fedservice 授权 api,如下所示

app.get('/login', function(req, res) {
    const clientURLToRedirect = req.query.url
    res.redirect(

      `https://example.fedservice.com/adfs/oauth2/authorize?response_type=id_token&redirect_uri=http://mynodejsserver.com/id_token?route=${clientURLToRedirect}&client_id=sample_client_id&nonce=12345&response_mode=form_post`
    )
  })

  app.post('/id_token', function(req, res) {
    var idToken = req.body.id_token
    var url = req.query.route
    console.log(idToken)
    res.cookie('idToken', idToken)
    res.redirect('http://localhost:4000' + url) // my react app url
  })

因此,通过在 nodejs 层处理它,能够在前端没有太大变化的情况下实现授权

于 2019-07-14T20:45:20.857 回答