簡體   English   中英

無法通過AngularJS請求WSO2 API(已激活CORS)

[英]Not able to request WSO2 API (with CORS activated) via AngularJS

當我的客戶端AngularJS應用嘗試通過WSO2 API管理器(v2.0.0)公開某些REST API時,我得到以下響應(IP,端口替換為“ am_host”和“ am_port”):

Refused to set unsafe header "Origin"
XMLHttpRequest cannot load http://am_host:am_port/ReferentielInfoConso/offres-tarifaires/identifiants. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access.

當我在Chrome開發者工具中檢查標題時,可以確認對“ OPTIONS”請求的響應中沒有“ Access-Control-Allow-Origin”標題。

header_chrome

當我在Chrome Advanced REST Client中使用相同的HTTP方法(GET / ReferentielInfoConso / offres-tarifaires / identifiants HTTP / 1.1)請求相同的URL時,可以看到預期的標頭“ Access-Control-Allow-Origin”,並且可以訪問到資源:

capture_rest_client

那么我應該怎么做才能使其在我的AngularJS應用程序中運行(不創建Node.js后端,我需要保持它的輕量化)? 為什么在WSO2中啟用CORS還不夠?

編輯:如果我的AngularJS應用程序不通過WSO2 AM,直接向Tomcat 7端點(默認情況下啟用了CORS)請求API,則它可以正常工作。

編輯2:當我的AngularJS應用試圖在不發送授權令牌的情況下到達WSO2 API時,我收到401響應,其中包含預期的“ Access-Control-Allow-Origin”標頭。 一旦添加令牌,看起來它通過WSO2 AM遵循了一條不同的路線,而我沒有得到“ Access-Control-Allow-Origin”標頭。

編輯3:如果我有一個“自動化”標頭,並嘗試直接到達我的Tomcat 7后端,我也會遇到一個“跨域”問題,但是我想這是因為“授權”標頭不在Tomcat允許的標頭列表中CONF。 不過,它在WSO2 AM允許的標頭列表中(我添加了“授權”和“授權”以確保它可以正常工作)。

因此,這是最終的答案:WSO2中存在多個錯誤,這些錯誤無法使CORS直接從Web應用程序(無后端)直接與API交互。

首先,出於沒有任何文獻記載的原因,/ token API不受repository / conf / api-manager.xml中的全局api conf影響,因此您需要深入了解conf(repository / deployment / server / synapse- configs / default / api / TokenAPI .xml),並添加CORSRequestHandler conf,以從同一目錄中的任何其他xml文件復制它。

其次,當您使用默認版本URL(將1.0版本標記為默認版本時,使用http:// host:port / Context / myapi代替http:// host:port / Context / 1.0 / myapi )時,您將不會無法收到CORS標頭: https : //wso2.org/jira/browse/APIMANAGER-5361

因此,在TokenAPI .xml中手動配置CORShandler並用顯式版本調用替換了我的調用之后,我可以刪除我的反向代理。 我仍然希望糾正默認版本的錯誤,因為默認版本是一個有用的功能。

我通過修改WSO2 API管理器發行版的文件夾repository \\ resources \\ api_templates中包含的文件default_api_template.xml解決了該錯誤。

我剛剛修改了線路

<resource methods="POST PATCH GET DELETE HEAD PUT">

通過以這種方式添加OPTIONS動詞:

<resource methods="POST PATCH GET DELETE HEAD PUT OPTIONS">*

現在默認端點也可以與cors調用一起使用。

如果您未在API Publisher UI的資源列表中定義OPTIONS方法,則APIM應發送所有CORS標頭,如api-manager.xml中所指定。

另請注意,您可以從發布商界面按API定義CORS配置。 如果已進行配置,則該特定API將忽略api-manager.xml中給出的CORS配置。

如果您的后端啟用了CORS,您也可以向后端發送OPTIONS請求。 為此,您可以在API Publisher中為/* OPTIONS創建資源。

對於我的特殊情況,我想讓客戶端應用程序請求令牌並在AJAX中調用API,我選擇了最簡單的解決方案:使用以下這些簡單的conf行在與WSO2相同的計算機上配置Apache Web服務器。

    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Methods "GET,PUT,POST,DELETE,PATCH,OPTIONS"
    Header set Access-Control-Allow-Headers "authorization,Access-Control-Allow-Origin,Content-Type,SOAPAction,Authorization"

    ProxyPass "/" "http://10.22.106.101:8280/"
    ProxyPassReverse "/" "http://10.22.106.101:8280/"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM