2014-07-18 84 views
5

Flask kullanarak bir api sitesi oluşturmaya çalışıyorum ve belirteci belirtimi sağlamak için Flask-jwt kullanıyorum.
authorizaiton ben yerine joker kullanarak daha detaylı erişim denetimi sahip olmak istiyorum, ancak bujwt auth sarıcı uygulandığında flask-cors sarıcı çalışmıyor.

Header set Access-Control-Allow-Origin "*"

gibi (Allow-Erişim başlıkları eklemek için mod_headers kullanarak Apache CORS'yi yaparsanız sorunsuz çalışıyor. Ve Ben . kökenini kontrol etmek ve başlık göndermek için güzel sarıcı olan flask-cors baktı ve şimdi benim rota böyle görünüyor (ve apache ayarlarında hiçbir başlığı manipülasyon)

@app.route('/protected/place') 
@cross_origin(headers=['Content-Type']) # Send Access-Control-Allow-Headers 
@jwt_required() 
def my_view_func(): 
    do something 

Ama şimdi Acces almazsınız javascript'ten http isteği yaparsam s-Control üstbilgileri sunucudan yanıt verir. (Ancak, el ile gönderirseniz, curl yapmak gibi, hala çapraz kaynaklı eklentinin çalışmasını ve Erişim denetimi üstbilgilerini görebiliyorum)

@jwt_required sarıcısını kaldırdığımda, cross_origin sarıcı işlevi düzgün çalışıyor ve bana yanıt verecektir. Jwt_required sarıcı uygulandığında , sunucudan yanıt görünmeyebilir.

Müşteri sayfamı krom ile hata ayıklama yapıyorum. BTW

Sarmalayıcıların sırasını değiştirmeyi denedim, ancak yardımcı olmuyor.

mümkün mü, o kimlik doğrulama başarısız olursa, Erişim Kontrol başlıkları göndermez cross_origin sarıcı?

iki sarmalayıcıların kaynak kodu:
şişesi-jwt:
https://github.com/mattupstate/flask-jwt/blob/master/flask_jwt/init.py
şişesi-cors:
https://github.com/wcdolphin/flask-cors/blob/master/flask_cors.py

+3

gibi
saatlerce mücadele sonra sonunda sorunu buldum. Umut, aynı sorunu kodlayan başkalarına yardımcı olur. Sadece 'kimlik gerekiyorsa app.route @ bu '' ' gibi. Erişim-Control-Allow-Headers'' etmek ('/ korumalı/yer') @cross_origin (başlıklar = [ "Yetkilendirme eklemem gerekiyor 'Content-Type', 'Yetki']) # Gönder Erişim-Control-Allow-Başlıkları @jwt_required () def my_view_func(): '' ' –

+0

biliyor musunuz bir şey/auth' etmek CORS'yi eklemek için bir yol yapmak handler? –

+0

@YangHu Gönderim için çok teşekkürler, aslında CORS uzantısını nasıl kullandığımı değiştirmeme neden oldu.Genel olarak (aynı zamanda her görünüm işlevinde dekoratör kullanılmasının aksine) aynı şeyi yapabileceğinizi keşfettim. '' 'CORS (app, origins =" ​​http://127.0.0.1:8080 ", allow_headers = [" İçerik Türü "," Yetkilendirme "aracılığıyla , "Erişim-Kontrol-İzin-Kimlik Bilgileri"], supports_credentials = Doğru) '' '. @Nikolay Fominyh Eğer uzantıyı kullanmıyorsanız, dekoratörler aşağıdaki gibi bir görünümde yığabilirsiniz: '' '@.route ('someurl /') @cross_origin (burada yapılandırmanızın) @ auth.login_required def some_view(): ... '' ' – AdjunctProfessorFalcon

cevap

5

saatlerce mücadele sonra sonunda sorunu buldum. Umarım aynı sorunu şifreleyen başkalarına yardım eder.
Kimlik doğrulaması gerektiğinde, yalnızca Authorization "üstbilgiler" argümanına (Access-Control-Allow-Headers alanını ayarlar) eklemeniz gerekir. Bu
@app.route('/protected/place') @cross_origin(headers=['Content-Type','Authorization']) # Send Access-Control-Allow-Headers @jwt_required() def my_view_func(): do something

+0

Çözümü çözdüğünüze sevindim, üzgünüm çok uzun sürdü ve net değil olması gerektiği gibi. Birkaç GOTCHA ekleyeceğim ve Yetkilendirme başlıklarının gerekli olabileceğinden emin olacağım. Ne yazık ki, bu onlara izin vermek için güvenli bir varsayılan değil (olası bir saldırıya neden olabilir) –