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)
我对我的代码的期望如下:
fetch使用来自导入的API模块的数据访问令牌clientToken属性this.state等于收到的访问令牌.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)
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)
小智 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)
我遇到了同样的问题,我在使用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)
| 归档时间: |
|
| 查看次数: |
190057 次 |
| 最近记录: |