0

以下情况:

使用 docker compose ( http://127.0.0.1:8083 )设置 Keycloak 服务器

当我这样做时:

curl --data "grant_type=password&client_id=account&username=dr&password=dr" http://127.0.0.1:8083/auth/realms/xxx/protocol/openid-connect/token 

有用。

然后我尝试在 react.js 上做同样的事情,如下:

axios.post(kc.authServerUrl + "/realms/xxx/protocol/openid-connect/token", {
    grant_type: 'password',
    client_id: 'account',
    username: 'dr',
    password: 'dr'
}
)
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

它不起作用。我得到以下信息:

在此处输入图像描述

旁注:在 keycloak 上,我设置了允许来源 * 也很奇怪:我看到用户已经从 ip 172.17.0.1 打开了会话(我猜这是由 curl 引起的)

问题:如何使它从 react.js 工作?问题 2:为什么它在 curl 中工作而不是在 axios 中工作?

4

2 回答 2

2

好的,这似乎有效:

fetch(kc.authServerUrl + "/realms/xxx/protocol/openid-connect/token", {
        method: 'POST',
        mode: 'no-cors',
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: 'grant_type=password&client_id=account&username=dr&password=dr'
    });
于 2017-04-10T22:39:17.717 回答
1

如果像我这样的人想坚持使用axios,找到了解决方案。

正如 axios wiki 中所说,默认情况下,axios 将 JavaScript 对象序列化为 JSON。因此,要发送数据,application/x-www-form-urlencoded您可以这样做:

var params = new URLSearchParams();

params.append('grant_type', 'password');
params.append('client_id', 'account');
params.append('username', 'dr');
params.append('password', 'dr');

axios.post('/realms/xxx/protocol/openid-connect/token', params);

或者您可以使用 qs 库执行此操作:

import qs from 'querystring';

let data = {
  grant_type: 'password',
  client_id: 'account',
  username: 'dr',
  password: 'dr'
};

axios.post('/reals/xxx/protocol/openid-connect/token', qs.stringify(data));
于 2018-03-02T17:54:14.617 回答