服务器上的服务未使用本地激活的 oauth2 凭据

Locally activated oauth2 credentials not used by service on server

我有一个服务器 运行 ubuntu 14.04,运行 一个基于 flask 的网站,具有我正在测试的一些自定义 API 功能。对于这个网站,我有一些使用 oauth2client 连接到 Youtube 的代码。这必须手动验证,并存储在 .json 文件中:

from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import run_flow

flow = flow_from_clientsecrets(self.YOUTUBE_CLIENT_SECRETS_FILE,
                               scope=self.YOUTUBE_READ_WRITE_SCOPE,
                               message=self.MISSING_CLIENT_SECRETS_MESSAGE)

storage = Storage("{}/my-oauth2.json".format(os.path.dirname(os.path.realpath(__file__))))
credentials = storage.get()

if credentials is None or credentials.invalid:
    credentials = run_flow(flow, storage, self.args)

我已经在开始使用的本地主机服务器上测试了这段代码:

python run.py runserver

在这种情况下,它按预期工作。我只需验证一次,API-调用成功。

>>> response = requests.post(url='http://localhost:5000/api', data=data)
>>> response.status_code
200

但是,当 运行 这作为服务器上的 uwsgi/nginx 服务时,身份验证不会以某种方式被接受。使用 os.path.isfile(<filename>) returns True 检查凭据文件是否存在,但 credentials 变量最终变为 None,我的服务器要我再次进行身份验证。这显然会导致我正在测试的 API 调用在前 2 次超时,之后每次都失败。 (这是预期的,因为它尝试进行身份验证的方式)

>>> response = requests.post(url=my_api_url, data=data)
>>> response.status_code
504
>>> response = requests.post(url=my_api_url, data=data)
>>> response.status_code
504
>>> response = requests.post(url=my_api_url, data=data)
>>> response.status_code
502

我的问题是: 为什么我存储的凭据适用于本地主机,但不适用于我的服务?如何修复它以便我可以使用本地主机进行身份验证,并让我在服务器上的服务使用这些凭据?

解法相当虎头蛇尾

在我的多次编辑过程中,我不知不觉地更改了文件的所有者和权限。使用 sudo chown :www-data my-oauth2.jsonsudo chmod 755 my-oauth2.json 似乎解决了这个问题。

经常检查你的文件 read/write 权限!