当前位置: 首页 > 知识库问答 >
问题:

不能在用户API后面对App Engine使用Javascript获取

罗智刚
2023-03-14

我有一个Flask应用程序,只有应用程序引擎项目的管理员才能使用以下应用程序访问它。yaml:

version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  script: app.py
  secure: always
  login: admin

在我的应用程序中,我有一个endpoint,它只是返回一些JSON:

@app.route('/api/v1/data')
def api():
    return jsonify(data)

在我的前端,我尝试用Javascript获取JSON数据(当我运行“普通”flask服务器时,它工作得非常好):

fetch('/api/v1/data')
.then(function (response) {
    console.log(response)
    return response.json();
  }).then(function (myData) {
    doSomethingWithData(myData);
  });

但是,我无法获取数据。使用本地服务器时,出现以下错误:

(index):1 Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0

响应似乎说我没有登录,并在控制台日志中给我一个url(注意:我没有在任何地方添加任何类型的回调,我认为这来自用户API):

http://127.0.0.1:5000/_ah/login?continue=http%3A//127.0.0.1%3A5000/api/v1/data

在部署的应用程序上,我得到:

Fetch API cannot load https://www.google.com/accounts/ServiceLogin?service=ah&passive=true&contin....
Redirect from 'https://www.google.com/accounts/ServiceLogin?service=ah&passive=true&contin...'
to 'https://accounts.google.com/ServiceLogin?service=ah&passive=true&continue=...'
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the
requested resource. Origin 'https://....appspot.com' is therefore not allowed access.
If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the
resource with CORS disabled.

我尝试将CORS添加到fetch调用和flask响应中,但没有成功。在谷歌上也找不到任何关于它的信息,所以任何帮助都将不胜感激!

共有2个答案

范福
2023-03-14

'

您没有在函数中定义data,所以这可能是问题所在。你能给我们看一下那个代码吗?

@app.route('/api/v1/data')
def api():
    data = ....
    return jsonify(data)

并且,对该url的回调将没有管理员权限,因此login: admin不能在那里使用。尝试:

handlers:
- url: /api/v1/data
  script: app.py
  #secure: always # if you use this, make sure you specify an https callback url: http://127.0.0.1:5000/_ah/login?continue=https%3A//127.0.0.1%3A5000/api/v1/data (when deployed with production url)

- url: /.*
  script: app.py
  secure: always
  login: admin

然后,继续=https://127.0.0.1:5000/api/v1/data无法从Google API工作,因为他们无法访问您的本地开发服务器。

谭新知
2023-03-14

我在进一步调试后发现了问题。

默认情况下,Javascript获取API不发送Cookie。而且,由于Google App Engine的用户API使用Cookie来登录会话,fetch发出的请求似乎未经验证。要随请求一起发送Cookie,您必须将具有“相同来源”的请求凭据添加到提取调用:

fetch('/api/v1/data', { credentials: 'same-origin' })
 类似资料:
  • 问题内容: 遇到了似乎是同源政策的问题,这引起了很多麻烦! 为了追赶,我基本上是在仅提供用户名时尝试获取用户的steam64id。 例如,我的用户名:“ Emperor_Jordan”将转到: http://steamcommunity.com/id/emperor_jordan?xml=1 而我需要的小蒸汽就在顶部。所以我想我将使用JQuery Ajax来获取它并解析出我以后需要使用的id(st

  • 嗨,我正在尝试使用youtube应用程序获取youtube用户名和缩略图。我正在使用v3.0和javascript库。我正在遵循这个示例和文档:https://developers.google.com/youtube/v3/code_samples/javascripthttps://developers.google.com/api-client-library/javascript/refe

  • 我正在Laravel应用程序中使用twitter API。在我的应用程序中,当用户插入url时,我想获得用户名和个人资料图片。我找了很多,但没找到。对于用户信息,我必须让用户登录到twitter,并与我的应用程序连接以获取访问令牌。我只想使用应用程序授权,这样用户就不需要登录twitter。我发现,通过这个搜索API可以搜索带有承载令牌的推文 有什么API可以让我使用URL获取用户屏幕名称吗? 我

  • 我可以使用Stripe API接收客户付款,但我希望它应该使用客户ID发送给其他客户。 我已经编写了接收付款的代码,但我希望付款应使用他的客户ID发送给其他客户。 它应该发送给其他客户,但我不知道要在这里添加哪些其他代码片段。

  • 是不是可以在响应JSON中对结果进行身份验证,而无需任何令牌身份验证?我的项目有两种类型的用户(用户=1和供应商=2)。我需要这两个用户都有不同的页面时,他们登录到我的系统。响应如下: 此用户为普通用户,将进入用户页面,而用户类型为2的其他用户将进入供应商页面。 这是我的密码: 在渲染组件上,当用户成功登录时,我使用重定向转到主页“/主页”: 我想要的是,当userType等于2时,它们将转到供应

  • 这里有个问题(如果你可以这么叫的话),每次我编写包含函数的JS时,它都不起作用。我知道这和空格、换行或诸如此类的东西有关。也许我不知道规则或语法。我正在使用Sublime文本3(如果它是相关的)。如果你向我解释原因,我会很感激,这样我就不会再面临这个问题了。这是一个在我的计算机上不起作用的代码 null null