我正在尝试从Django中获取一个令牌--OauthToolkit但我只得到“unsupported_grant_type”错误:
以下是我在react-native中所写的内容:
async getToken (client_id, client_key, username, password) {
let response = await fetch('https://example.com/o/token/', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
body: JSON.stringify({
'client_id': client_id,
'client_secret': client_key,
'grant_type': 'password',
'username': username,
'password': password,
})
})
let responseJson = await response.json()
var token = responseJson.error <- written to see the error (shoul be responseJson.acces_token)
this.setState({token})
}
其他帖子提到它可能是标题中的错误 - 但它现在让我无能为力。
答案 0 :(得分:1)
在抓了脑袋和无数的Google搜索之后,这就是我的操作方式。
允许我做些假设
假设当您访问端点时出现错误
“详细信息”:“未提供身份验证凭据。”
假设您可以通过邮递员身份验证/获取访问令牌,或者通过向带有参数的/ o / token发送POST请求
使用django-oauth-toolkit,将数据/正文作为
发送至关重要“内容类型”:“ application / x-www-form-urlencoded”
注意:我的方法可能并不简洁,因此我欢迎任何建设性的批评/建议
import { AUTH_LOGIN} from 'react-admin';
var _client_id = 'xxxxxxxxx';
var _grant_type = 'password';
export default (type, params) => {
if (type === AUTH_LOGIN) {
const {username, password } = params;
let _data = "grant_type="+_grant_type+"&username="+username+"&password="+password+"&client_id="+_client_id
const request = new Request('http://localhost:8000/api/ps/o/oauth/token/', {
method: 'POST',
headers: new Headers({
'Content-Type': 'application/x-www-form-urlencoded',}),
body : _data,
})
return fetch(request)
.then(response => {
if (response.status < 200 || response.status >= 300) {
throw new Error(response.statusText);
}
return response.json();
})
.then(({ access_token }) => {
localStorage.setItem('token', access_token);
});
}
return Promise.resolve();
}
最后但重要的是,/ o / token返回带有键“ access_token”而不是令牌的字典。因此,请修改您的代码,如下所示
.then(({ access_token }) => {localStorage.setItem('token', access_token);});