【问题标题】:CORS requests blocked but headers seem OK. What is wrong?CORS 请求被阻止,但标头似乎正常。怎么了?
【发布时间】: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


【解决方案1】:

我想添加以下内容:

self.response.headers.add_header("Access-Control-Allow-Origin", "*")

而不是

self.response.headers['Access-Control-Allow-Origin'] = 'http://localhost:8080'

在您的处理程序中将解决问题。

【讨论】:

    猜你喜欢
    • 2020-07-09
    • 2016-01-21
    • 2018-10-18
    • 2020-08-16
    • 2022-11-01
    • 1970-01-01
    • 2020-07-18
    • 2022-01-24
    • 2022-01-14
    相关资源
    最近更新 更多