通过React-Native从Django OauthToolkit获取请求令牌

时间:2016-03-31 22:27:34

标签: django oauth-2.0 react-native

我正在尝试从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})
}

其他帖子提到它可能是标题中的错误 - 但它现在让我无能为力。

1 个答案:

答案 0 :(得分:1)

在抓了脑袋和无数的Google搜索之后,这就是我的操作方式。

允许我做些假设

  1. 假设您的后端服务器运行正常,并且所有端点都受到保护。
  2. 假设当您访问端点时出现错误

      

    “详细信息”:“未提供身份验证凭据。”

  3. 假设您可以通过邮递员身份验证/获取访问令牌,或者通过向带有参数的/ o / token发送POST请求

    • 用户名
    • 密码
    • client_id
    • grant_type

使用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);});