【发布时间】:2019-11-29 07:23:15
【问题描述】:
背景:
GAE 有一个 Authenticating Users on App Engine Using Firebase tutorial,您可以在其中部署一个名为 firenotes (code at github) 的小笔记应用程序。它有一个前端,可以与 firebase 进行“对话”以进行身份验证,并让用户查看他们的笔记。它有一个后端,它使用flask来验证身份验证状态并返回用户配置文件信息和注释。
我正在尝试制作具有相同架构但使用 webapp2 的相同应用程序。
问题
firebase 身份验证有效,我做了一些更改。很容易。
但是,后端不会将注释返回到前端。它失败是因为 CORS 策略阻止读取对后端的请求。我被困在尝试了许多替代方案并被篡改了很多。
这是我尝试处理 CORS 的方式。一个非常简单的 webapp2 处理程序,带有一个 get 方法、一个 put 方法和一个 preflight options 方法以及相应的标头:
class Notes(webapp2.RequestHandler):
def options(self):
self.response.headers['Access-Control-Allow-Origin'] = 'http://localhost:8080'
self.response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization, Access-Control-Allow-Origin'
self.response.headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE'
def get(self):
self.response.headers.add_header('Access-Control-Allow-Origin',
'http://localhost:8080')
self.response.headers['Content-Type'] = 'application/json'
auth_request = google.auth.transport.requests.Request()
# Verify Firebase auth.
id_token = self.request.headers['Authorization'].split(' ').pop()
claims = google.oauth2.id_token.verify_firebase_token(id_token, auth_request)
#more code...
def post(self):
self.response.headers.add_header('Access-Control-Allow-Origin', 'http://localhost:8080')
self.response.headers['Content-Type'] = 'application/json'
# Verify Firebase auth.
id_token = self.request.headers['Authorization'].split(' ').pop()
auth_request = google.auth.transport.requests.Request()
claims = google.oauth2.id_token.verify_firebase_token(id_token, auth_request)
if not claims:
return 'Unauthorized', 401
#more code
但它不起作用!
我可以编写新笔记,并确认它们已按预期包含在数据存储中。但它们从未在前端展示过。相反,这是 Firefox 开发工具向我展示的内容:
跨域请求被阻止:同源策略不允许读取位于http://localhost:8081/notes 的远程资源。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。
但是,如果我将 Access-Control-Allow_Origin 包含在我的处理程序中,它怎么会丢失呢??
所有三个请求 - GET、PUT 和 OPTIONS - 返回代码 200 OK。
我错过了什么??
注意 1
此警告在 Firebase 登录期间出现 2 次,然后每次用户单击以包含新注释时出现一次。因此,似乎每次前端对后端(localhost:8081/notes)进行jquery ajax调用时都会出现这种情况。
注意 2
我没有修改前端的javascript。我认为 webapp2 应该能够做任何 flask/flask_cors 正在做的事情,所以 js 应该保持不变。
【问题讨论】:
-
响应的HTTP状态码是什么?您可以使用浏览器开发工具中的网络窗格进行检查。是 4xx 还是 5xx 错误而不是 200 OK 成功响应?它是对 CORS preflight OPTIONS 请求的响应吗?
-
GET、PUT 和 OPTIONS 获得 200 OK。
标签: python-2.7 google-app-engine cors firebase-authentication webapp2