GAE 通过 app.yaml、python 装饰器或 users.get_current_user 强制登录?

2023-12-07

我在 GAE 应用程序的 app.yaml 配置文件中使用“登录”选项。看起来像这样:

- url: /admin/.*
  script: myapp.app
  login: admin

- url: /.*
  script: myapp.app
  login: required

更新(根据建议霸道龙虾):我希望用户始终登录(未签名的用户无法执行任何操作),并且我需要知道用户是谁。实际上,我需要 OAuth2 凭据才能与 Google API 进行通信(例如,我需要使用 Google Profiles API 获取一些用户的信息,并使用 Google Calendar API 写入用户的日历)。最后,我需要一个管理员用户来执行一些操作(例如使用 Google 配置 API 创建新域的用户)

我正在使用 google-api-client 库,并使用 oauth2 装饰器。然后,在我的 RequestHandlers 中,我有这个:

class MainHandler(webapp.RequestHandler):

  @decorator.oauth_aware
  def get(self):
    if decorator.has_credentials():
      # do something

    else:
      url = decorator.authorize_url()
      self.response.out.write(template.render('templates/index.html',
           {'authorize_url': url}))

最后,我读到了另一种方法:

user = users.get_current_user()
if user:
  # do something
else:
  greeting = ("<a href=\"%s\">Sign in or register</a>." %
    users.create_login_url("/"))

  self.response.out.write("<html><body>%s</body></html>" % greeting)

处理用户身份验证以满足我的需求的最佳方法是什么(请参阅更新)?

提前谢谢了


我认为您可能会混淆 OAuth 2.0 装饰器与其他两种方法的作用。

OAuth 2.0 装饰器并非特定于您的应用程序,如果您想为用户获取 OAuth 2.0 凭据,然后使用这些凭据与 Google API 进行通信,则可以使用它。

另外两种只是从 App Engine 设置的会话 cookie 中获取用户信息的方法。

如果你真的想要一个装饰器,你会使用login_required,记录在这里:
https://developers.google.com/appengine/docs/python/tools/webapp/utilmodule

在指定之间没有一种最佳方法app.yaml,检查是否users.get_current_user is None或使用@login_required在指定的处理程序上。

您想要使用的三个不同时间的粗略近似如下:

1)如果您希望用户登录,但不需要知道具体用户,请使用login: required in app.yaml.

2) 如果想了解用户,但如果用户未登录也有后备,请使用users.get_current_user并根据用户或用户调整您的行为None如果这是返回值。

3) 如果您想了解用户并始终有一个登录用户,请使用@login_required.

UPDATE:

(基于对需求的进一步解释。)由于您始终希望用户登录并始终需要他们的 OAuth 2.0 凭据,因此您应该始终使用decorator.oauth_required.

至于使用API​​,只需谷歌日历API可以与google-api-python-client图书馆。这Google Apps 配置 API is a 谷歌数据API,而日历 API 是基于发现的API.

因此,您需要使用gdata-python-client library使用配置 API。您需要手动从oauth2client.client.OAuth2Credentials object to a gdata.gauth.OAuth2Token反对对任一者使用相同的令牌。

使用时OAuth2Decorator,您将能够访问一个实例oauth2client.client.OAuth2Credentials via decorator.credentials().

第二次更新:

我最近added对此的支持gdata-python-client.

from gdata.gauth import OAuth2TokenFromCredentials
auth_token = OAuth2TokenFromCredentials(decorator.credentials())
auth_token.authorize(client)

该实现允许两个令牌/凭证对象decorator.credentials() and auth_token无论您更改哪个对象的值,都保持同步。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GAE 通过 app.yaml、python 装饰器或 users.get_current_user 强制登录? 的相关文章

  • 如何删除Python字符串的最后一个utf8字符

    我有一个包含 utf 8 编码文本的字符串 我需要删除最后一个 utf 8 字符 到目前为止我做到了 msg msg 1 但这只会删除最后一个字节 只要最后一个字符是 ASCII 代码 它就可以工作 当最后一个字符是多字节字符时 它不再起作
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • 使用 Apache HTTPd 模块的 OAuth 2.0 身份验证

    是否可以使用 Apache HTTPd 服务器模块来实现 OAuth 2 0 或 1 0 我选择这条路线是因为每个请求都会首先到达 HTTPd 模块 因此我必须从那里进行身份验证 如果可能的话 请分享相关链接 我要补充一下尤金尼奥的答案mo
  • 如果值在列表 pandas 中,则布尔向量

    在 pandas 中创建布尔向量来测试值很容易 例如 DF a gt 10 但是你怎么写 DF a in list 根据某个列表或其他列表中系列中每个值的成员资格生成布尔向量 我收到一个值错误 我知道我可以非常简单地循环数据 但是不必这样做
  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • Google App Engine 实例不断快速关闭

    所以我已经使用应用程序引擎很长一段时间了 没有任何问题 我知道 如果应用程序有一段时间没有被访问者点击 那么实例将关闭 并且第一个访问该网站的访问者将有几秒钟的延迟 同时新实例启动 然而 最近这些实例似乎只在很短的时间内保持活动状态 有时不
  • 如何向未知用户目录读取/写入文件?

    我正在尝试从用户目录 C Users USERNAME Test Source 读取和写入文件 但我未能成功找到任何有关如何自动检测用户名的资源 其中的 USERNAME上面的例子 或者无论如何 我可以让它读取和写入目录 而不需要知道用户名
  • Google Cloud SDK 无法安装“.exe;.bat;.com”不是可识别的命令

    我正在尝试在 Windows 10 笔记本电脑上安装 google cloud SDK 我尝试删除安装文件夹中的空格 并将路径添加到我的环境变量中 完整的错误是 Output folder C Users user Documents Do
  • 如何将 pygame Surface 转换为 PIL 图像?

    我正在使用 PIL 来透视地变换屏幕的一部分 原始图像数据是一个 pygame Surface 需要转换为 PIL 图像 因此我发现了 pygame 的 tostring 函数就是为了这个目的而存在的 然而结果看起来很奇怪 见附图 这段代码
  • Python Scrapy:“runspider”和“crawl”命令有什么区别?

    有人可以解释一下两者之间的区别吗运行蜘蛛 and crawl命令 应该在什么情况下使用它们 在命令中 scrapy crawl options
  • 如何将自定义日志处理程序添加到 Google App Engine?

    我正在尝试向我的 java 应用程序添加自定义日志处理程序 我已经实现了一个扩展 java util Logging Handler 类的 InnerLogger 类 在我的logging properties中声明为处理程序 handle
  • 使用 OpenID 保护应用程序引擎中的 remote_api

    我之前问过一个question https stackoverflow com questions 2981226 app engine remote api with openid关于将应用程序引擎的remote api与openID一起
  • Gunicorn 工作人员无论如何都会超时

    我正在尝试通过gunicorn运行一个简单的烧瓶应用程序 但是无论我做什么 我的工作人员都会超时 无论是否有针对应用程序的活动 工作人员在我设置任何内容后总是会超时timeout值到 是什么导致它们超时 当我发出请求时 请求成功通过 但工作
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 如何在Python脚本中从youtube-dl中提取文件大小?

    我是 python 编程新手 我想在下载之前提取视频 音频大小 任何 YouTube 视频 gt gt gt from youtube dl import YoutubeDL gt gt gt url https www youtube c
  • 主屏幕上 iPhone Web 应用程序上的 Google appengine 身份验证

    我正在使用 Google appengine 开发一个可在浏览器和 iPhone 上使用的 Web 应用程序 我已经为此应用程序购买了域名 这样我就有了一个漂亮的 URL 我用过User API http code google com a
  • 在 matplotlib 中向颜色条添加标记或线条

    我有以下几行代码来生成热图 pcolormesh import matplotlib pyplot as plt import numpy as np vals np linspace np pi 2 np pi 2 101 x y np
  • 在张量流中保存模型

    Tensorflow 允许我们使用 tf train write graph 方法保存 加载模型的结构 以便我们可以在将来恢复它以继续我们的训练 但是 我想知道这是否有必要 因为我可以创建一个模块 例如 GraphDefinition py
  • 本地化:django-admin compilemessages 跳过 venv

    我正在使用本地化Django 1 11应用 我可以排除虚拟环境文件夹node modules文件夹 同时使用消息文件添加消息 i选项如 django admin makemessages l no i venv django admin m

随机推荐