2015-07-18 4 views
11

Ich bin der Umsetzung OAuth Twitter Nutzer-Zeichen in (Flask API und Angular)Flask CORS - kein Zugang-control-allow-Ursprung-Header vorhanden auf einer Umleitung()

Ich halte die folgende Fehlermeldung erhalten, wenn ich das Klicken Melden Sie sich mit twitter-Taste und ein Pop-up-Fenster öffnet sich:

XMLHttpRequest cannot load https://api.twitter.com/oauth/authenticate?oauth_token=r-euFwAAAAAAgJsmAAABTp8VCiE. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 

ich die python-Cors Pakete bin mit CORS zu handhaben, und ich bereits instagram Zeichen in richtig funktioniert haben. Ich glaube, es hat etwas damit zu tun, dass die Antwort eine Weiterleitung ist, aber das Problem nicht beheben konnte.

Mein Kolben-Code sieht wie folgt aus:

app = Flask(__name__, static_url_path='', static_folder=client_path) 
cors = CORS(app, allow_headers='Content-Type', CORS_SEND_WILDCARD=True) 
app.config.from_object('config') 

@app.route('/auth/twitter', methods=['POST','OPTIONS']) 
@cross_origin(origins='*', send_wildcard=True) 
#@crossdomain(origin='') 
def twitter(): 
    request_token_url = 'https://api.twitter.com/oauth/request_token' 
    access_token_url = 'https://api.twitter.com/oauth/access_token' 
    authenticate_url = 'https://api.twitter.com/oauth/authenticate' 

    # print request.headers 

    if request.args.get('oauth_token') and request.args.get('oauth_verifier'): 
     -- omitted for brevity -- 
    else: 
     oauth = OAuth1(app.config['TWITTER_CONSUMER_KEY'], 
         client_secret=app.config['TWITTER_CONSUMER_SECRET'], 
         callback_uri=app.config['TWITTER_CALLBACK_URL']) 
     r = requests.post(request_token_url, auth=oauth) 
     oauth_token = dict(parse_qsl(r.text)) 
     qs = urlencode(dict(oauth_token=oauth_token['oauth_token'])) 
     return redirect(authenticate_url + '?' + qs) 

Antwort

8

Das Problem ist nicht deine. Ihre clientseitige Anwendung sendet Anfragen an Twitter, also müssen Sie CORS nicht unterstützen, es ist Twitter. Aber die Twitter-API unterstützt derzeit CORS nicht, was bedeutet, dass Sie nicht direkt mit dem Browser sprechen können.

Eine gängige Praxis zur Vermeidung dieses Problems besteht darin, dass Ihre clientseitige Anwendung die Authentifizierungsanfragen an einen eigenen Server sendet (z. B. dieselbe Flask-Anwendung wie Sie), und der Server wiederum eine Verbindung mit Twitter herstellt API. Da die Serverseite nicht an die CORS-Anforderungen gebunden ist, gibt es kein Problem.

Falls Sie einige Ideen, ich habe auf zu tun, diese Art von Authentifizierungsablauf für Facebook und Twitter einen Blog-Artikel geschrieben: http://blog.miguelgrinberg.com/post/oauth-authentication-with-flask

+0

ich gegabelt Ihr Repo, die in dem Artikel bereitgestellt wird Sie auf dem Laufenden. Erhalten Sie den gleichen Fehler auf der Clientseite. 'XMLHttpRequest kann nicht geladen werden https://api.twitter.com/oauth/authorize?oauth_token=FozjZwAAAAAAgJsmAAABTqljgg0. Auf der angeforderten Ressource ist kein Header "Access-Control-Allow-Origin" vorhanden. Herkunft 'null' ist daher nicht erlaubt access.' –

+0

Wie es aussieht, der Client startet, aber senden eine Post-Anfrage an den Server einer anderen Domäne (Flask api) authorize/twitter, die dann die Twitter-Weiterleitung zurückgibt, und das ist, wo ich Sehen Sie die Fehlermeldung in der Client-App –

+0

Der Fehler, den Sie mir zeigen, schlägt vor, dass der Browser eine Anfrage direkt an die Twitter-API sendet, so dass es nicht mit dem übereinstimmt, was Sie sagen. Beachten Sie die URL https: //api.twitter.com/... in der Fehlermeldung. Die Implementierung in meinem Tutorial sendet niemals Ajax-Anfragen direkt an den Provider, alle Anfragen gehen über die Flask-Anwendung (die ich praktisch in der gleichen Domäne wie die Client-Seite-App anbiete). – Miguel

Verwandte Themen