我正在实施OAuth Twitter用户登录(Flask API和Angular)
当我点击使用twitter按钮登录并弹出一个弹出窗口时,我一直收到以下错误:
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.
我正在使用python-Cors包来处理CORS,我已经有instagram登录正常工作了。 我认为它与响应是重定向有关,但无法解决问题。
我的烧瓶代码如下:
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)
答案 0 :(得分:9)
问题不在于你。您的客户端应用程序正在向Twitter发送请求,因此您不需要支持CORS,而是Twitter。但Twitter API目前不支持CORS,这实际上意味着您无法直接从浏览器与它通信。
避免此问题的常见做法是让客户端应用程序将身份验证请求发送到您自己的服务器(例如您拥有的相同Flask应用程序),然后服务器连接到Twitter API 。由于服务器端不受CORS要求的约束,因此没有问题。
如果你想要一些想法,我写了一篇关于为Facebook和Twitter做这种类型的身份验证流程的博客文章:http://blog.miguelgrinberg.com/post/oauth-authentication-with-flask