web-dev-qa-db-ja.com

「リクエストヘッダーフィールドの認証は許可されていません」エラー-Tastypie

AJAX and Tastypie:

XMLHttpRequest cannot load http://domain.com/api/v1/item/?format=json&username=popo&api_key=b83d21e2f8bd4952a53d0ce12a2314c0ffa031b1. Request header field Authorization is not allowed by Access-Control-Allow-Headers.

これを解決する方法についてのアイデアはありますか?

Chromeからのリクエストヘッダーは次のとおりです。

Request Headersview source

Accept:*/*
Accept-Charset:
ISO-8859-1,utf-8;q=0.7,*;q=0.3

Accept-Encoding:gzip,deflate,sdch

Accept-Language:en-US,en;q=0.8

Access-Control-Request-Headers:
Origin, authorization, access-control-allow-Origin, accept, access-control-allow-headers

Access-Control-Request-Method:
GET

Chromeからの応答ヘッダーは次のとおりです。

Response Headersview source

Access-Control-Allow-Headers:
Origin,Content-Type,Accept,Authorization

Access-Control-Allow-Methods:
POST,GET,OPTIONS,PUT,DELETE

Access-Control-Allow-Origin:*

Connection:keep-alive

Content-Length:0
Content-Type:
text/html; charset=utf-8

Date:Fri, 11 May 2012 21:38:35 GMT

Server:nginx

ご覧のとおり、両方とも認証用のヘッダーを持っていますが、認証は機能しません。

Django応答ヘッダーの編集に使用しているミドルウェア: https://Gist.github.com/1164697

編集:私は問題を理解しました。 www.domain.comに接続しようとしましたが、domain.comのみを受け入れます

25
egidra

これは、 Same Origin policy が原因で発生します。

AJAXリクエストが送信されるのと同じドメインからの呼び出しを行うか、外部ドメインからのリクエストを許可するサーバー側の変更を行う必要があります。

これを解決するには、ヘッダーで外部ドメインを許可して、 http://domain.com のヘッダーを変更する必要があります。

Access-Control-Allow-Origin: *

読み取り 詳細

4
antyrat

アンティラットの答えは完全ではありません。

サーバーが許可するヘッダーを指定する必要があります。あなたの場合Authorization

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization
58
Manuel Bitto

@Manuel Bittoの答えを支持しましたが、
Apache Tomcat 5.xで動作する完全なCorsフィルターを含む別の回答を投稿したいと思います。

public class CorsFilter implements Filter {

    public CorsFilter() { }

    public void init(FilterConfig fConfig) throws ServletException { }

    public void destroy() { }

    public void doFilter(

            ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpServletResponse = (HttpServletResponse)response;
        httpServletResponse.addHeader("Access-Control-Allow-Origin", "*");
        httpServletResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS, DELETE");
        httpServletResponse.addHeader("Access-Control-Allow-Headers", "Authorization");

        chain.doFilter(request, response);
    }
}

「Access-Control-Allow-Methods」ヘッダー値へのOPTIONSの追加に特に注意を払うことをお勧めします。
それを行う理由は、Mozillaが here を提供した説明によると、
リクエスト(POSTなど)に特別なヘッダーまたはコンテンツタイプが含まれている場合(これが私の場合です)、XMLHttpRequestオブジェクトは追加のOPTIONS呼び出しを生成します。これはコードで対処する必要があります。
これがお役に立てば幸いです。

2
Yair Zaslavsky

問題は、www.domain.comがdomain.comとは異なるように見えることでした。 domain.comは機能しましたが、www.domain.comを使用すると、別のドメインからのリクエストを行っていると検出されました

0
egidra

私はこの質問が古いことを知っています。

しかし、今日、私はowinを追加した後、同じcors問題に遭遇しました。グーグルで多くの検索を行い、さまざまなソリューションを試した後。以下を追加してCORSの問題を解決しました

<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />

詳細については、以下のリンクに従ってください。ありがとう。

[ http://benfoster.io/blog/aspnet-webapi-cors]

0
C For Code