我在Django中设置了rest-api,并使用React Native连接它。我已注册用户并能够生成令牌但是我无法在GET请求的标头中传递令牌。我的代码如下:
try{
let response = await fetch("http://127.0.0.1:8000/fishes/auth/",
{
method: 'GET',
headers: {
// 'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': ' Token '+accessToken,
}});
let res = await response.text();
}}
我一直在关注此链接http://cheng.logdown.com/posts/2015/10/27/how-to-use-django-rest-frameworks-token-based-authentication,并且已经确认其余api的回复是正确的。
然而,在原生反应的手机上,我在控制台中收到以下错误:
TypeError: Network request failed
at XMLHttpRequest.xhr.onerror (fetch.js:441)
at XMLHttpRequest.dispatchEvent (event-target.js:172)
at XMLHttpRequest.setReadyState (XMLHttpRequest.js:542)
我在GET代码中做错了什么?
答案 0 :(得分:0)
好的401状态代码,表示UnAuthorized。 对于Django Rest Framework,您必须将访问令牌作为所有API请求的标头的一部分传递。
标题格式为
Key : Authorization
Value: Token <token>
你可以在这里看到更多 http://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication
答案 1 :(得分:0)
我认为你需要改变
&#39;内容类型&#39;到&#39;内容类型&#39;
小写
答案 2 :(得分:0)
请参见This answer。
同源策略限制了网页可以从另一个来源发送到资源的请求的类型。
在无核模式下,浏览器仅限于发送“简单”请求-仅具有安全列出的方法和安全列出的标头的请求。
要发送带有诸如Authorization和X-My-Custom-Header之类的标头的跨域请求,您必须放弃no-cors模式并支持预检请求(OPTIONS)。
“简单”和“非简单”请求之间的区别是出于历史原因。网页始终可以通过各种方式(例如创建和提交表单)执行一些跨域请求,因此,当Web浏览器引入一种原理性的发送跨域请求的方式(跨域资源共享或CORS)时,决定可以将这种“简单”的请求从飞行前的OPTIONS检查中排除。
如OP所述,我通过处理预检请求来解决此问题。
以前,在我的中间件中,我过滤掉不包含auth令牌的请求,如果它们尝试访问私有数据,则返回403。现在,我检查预检并发送允许这些类型的标题的响应。这样,当以下请求到来(获取,发布等)时,它将具有所需的标头,并且我可以按照最初的意图使用中间件。
这是我的中间件:
class ValidateInflight(MiddlewareMixin):
def process_view(self, request, view_func, view_args, view_kwargs):
assert hasattr(request, 'user')
path = request.path.lstrip('/')
if path not in EXEMPT_URLS:
logger.info(path)
header_token = request.META.get('HTTP_AUTHORIZATION', None)
if header_token is not None:
try:
token = header_token
token_obj = Token.objects.get(token=token)
request.user = token_obj.user
except Token.DoesNotExist:
return HttpResponse(status=403)
elif request.method == 'OPTIONS':
pass
else:
return HttpResponse(status=403)
这是我的选项处理
class BaseView(View):
def options(self, request, *args, **kwargs):
res = super().options(request, *args, **kwargs)
res['Access-Control-Allow-Origin'] = '*'
res['Access-Control-Allow-Headers'] = '*'
return res