在React Native中使用带有Fetch的授权标头

Ric*_*Kho 114 javascript oauth-2.0 react-native fetch-api

我正在尝试使用fetchReact Native从Product Hunt API中获取信息.我已经获得了正确的访问令牌并将其保存到状态,但似乎无法在GTP请求的授权标头内传递它.

这是我到目前为止所拥有的:

var Products = React.createClass({
  getInitialState: function() {
    return {
      clientToken: false,
      loaded: false
    }
  },
  componentWillMount: function () {
    fetch(api.token.link, api.token.object)
      .then((response) => response.json())
      .then((responseData) => {
          console.log(responseData);
        this.setState({
          clientToken: responseData.access_token,
        });
      })
      .then(() => {
        this.getPosts();
      })
      .done();
  },
  getPosts: function() {
    var obj = {
      link: 'https://api.producthunt.com/v1/posts',
      object: {
        method: 'GET',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json',
          'Authorization': 'Bearer ' + this.state.clientToken,
          'Host': 'api.producthunt.com'
        }
      }
    }
    fetch(api.posts.link, obj)
      .then((response) => response.json())
      .then((responseData) => {
        console.log(responseData);
      })
      .done();
  },
Run Code Online (Sandbox Code Playgroud)

我对我的代码的期望如下:

  1. 首先,我将fetch使用来自导入的API模块的数据访问令牌
  2. 之后,我将设置clientToken属性this.state等于收到的访问令牌.
  3. 然后,我将运行getPosts哪个应返回包含Product Hunt当前帖子数组的响应.

我能够验证是否正在接收访问令牌并且正在this.state接收它作为其clientToken属性.我也能够验证getPosts正在运行.

我收到的错误如下:

{"error":"unauthorized_oauth","error_description":"请提供有效的访问令牌.请参阅我们的api文档,了解如何授权api请求.请确保您需要正确的范围.例如,"私人公众\ "用于访问私有端点."}

我一直在假设我在某种程度上没有在我的授权标题中正确传递访问令牌,但似乎无法弄明白为什么.

Cod*_*niz 160

使用授权标头获取示例:

fetch('URL_GOES_HERE', { 
   method: 'post', 
   headers: new Headers({
     'Authorization': 'Basic '+btoa('username:password'), 
     'Content-Type': 'application/x-www-form-urlencoded'
   }), 
   body: 'A=1&B=2'
 });
Run Code Online (Sandbox Code Playgroud)

  • @RonRoyston你在看OPTIONS电话吗?如果API端点没有启用CORS(Access-Control-Allow-Origin:*,如果从其他域访问),则可能在OPTIONS调用时失败. (6认同)
  • 这不适合我."授权"标题默默无法附加每个萤火虫.我甚至尝试在可选对象中包含`credentials:'include'. (3认同)
  • 问题@RonRoyston看到了,**你需要导入btoa库**,它不是节点本机的.(它是浏览器库的一个端口.)否则auth标头创建会无声​​地失败.我们遇到了同样的事情. (2认同)
  • https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch每个文档,需要用`new Headers()包装头文件 (2认同)

Ric*_*Kho 55

事实证明,我使用的fetch方法不正确.

fetch 需要两个参数:API的端点和可以包含正文和标题的可选对象.

我在第二个对象中包装了预期的对象,但没有得到任何想要的结果.

以下是它在高级别上的表现:

fetch('API_ENDPOINT', OBJECT)  
  .then(function(res) {
    return res.json();
   })
  .then(function(resJson) {
    return resJson;
   })
Run Code Online (Sandbox Code Playgroud)

我构建了我的对象:

var obj = {  
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'Origin': '',
    'Host': 'api.producthunt.com'
  },
  body: JSON.stringify({
    'client_id': '(API KEY)',
    'client_secret': '(API SECRET)',
    'grant_type': 'client_credentials'
  })
Run Code Online (Sandbox Code Playgroud)

  • 完成了,希望有帮助 (2认同)

小智 32

如果您使用不记名令牌,以下代码片段应该有效:

const token = localStorage.getItem('token')

const response = await fetch(apiURL, {
    method: 'POST',
    headers: {
        'Content-type': 'application/json',
        'Authorization': `Bearer ${token}`, // notice the Bearer before your token
    },
    body: JSON.stringify(yourNewData)
})
Run Code Online (Sandbox Code Playgroud)


Mar*_*dor 5

我遇到了同样的问题,我在使用django-rest-knox作为身份验证令牌。事实证明,我的fetch方法看起来没有问题,如下所示:

...
    let headers = {"Content-Type": "application/json"};
    if (token) {
      headers["Authorization"] = `Token ${token}`;
    }
    return fetch("/api/instruments/", {headers,})
      .then(res => {
...
Run Code Online (Sandbox Code Playgroud)

我正在跑步阿帕奇。

为我解决了这个问题的原因是更改WSGIPassAuthorization'On'in wsgi.conf

我在AWS EC2上部署了Django应用程序,并使用Elastic Beanstalk管理我的应用程序,因此在中django.config,我这样做:

container_commands:
  01wsgipass:
    command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
Run Code Online (Sandbox Code Playgroud)