2015-07-18 12 views
11

Io sono l'attuazione OAuth Twitter User-segno (Flask API e angolare)Flask CORS - no Accesso-control-allow-origine intestazione presenti su un redirect()

Continuo a ricevere il seguente errore quando clicco sul accedi con il tasto twitter e una finestra pop-up si apre:

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. 

sto usando i pacchetti python-Cors per gestire CORS, e ho già segno instagram a lavorare correttamente. Credo che abbia qualcosa a che fare con la risposta essendo un reindirizzamento ma non sono stato in grado di correggere il problema.

Il mio codice pallone si presenta così:

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) 

risposta

8

Il problema non è tuo. La tua applicazione lato client sta inviando richieste a Twitter, quindi non sei tu che devi supportare CORS, è Twitter. Ma l'API di Twitter attualmente non supporta CORS, il che significa che non puoi parlarne direttamente dal browser.

Una pratica comune per evitare questo problema è far sì che l'app lato client invii le richieste di autenticazione a un proprio server (come questa stessa applicazione Flask che si ha), e a sua volta il server si connette a Twitter API. Dal momento che il lato server non è legato ai requisiti CORS, non ci sono problemi.

nel caso si desideri alcune idee, ho scritto un articolo del blog a fare questo tipo di flusso di autenticazione per Facebook e Twitter: http://blog.miguelgrinberg.com/post/oauth-authentication-with-flask

+0

ho biforcuta tuo repo che viene fornito in questo articolo che hai postato. Ma ricevi lo stesso errore sul lato client. 'XMLHttpRequest non può caricare https://api.twitter.com/oauth/authorize?oauth_token=FozjZwAAAAAAgJsmAAABTqljgg0. Nessuna intestazione Access-Control-Allow-Origin è presente sulla risorsa richiesta. L'origine 'null' non è quindi consentita l'accesso. –

+0

Allo stato attuale, il client inizia ma invia una richiesta di posta al server di un dominio diverso (Flask api) autorizza/twitter, che quindi restituisce il reindirizzamento twitter, ed è qui che io vedere il messaggio di errore sull'app client –

+0

L'errore che mi stai mostrando suggerisce che il browser sta inviando una richiesta direttamente all'API di Twitter, quindi non è d'accordo con quello che stai dicendo. Tieni presente che l'URL https: //api.twitter.com/... nel messaggio di errore. L'implementazione nel mio tutorial non invia mai richieste Ajax direttamente al provider, tutte le richieste passano attraverso l'applicazione Flask (che io convenientemente serve nello stesso dominio dell'app lato client). – Miguel