【问题标题】:Authentication on App Engine / Python / Django non-rel over JSONApp Engine / Python / Django non-rel over JSON 上的身份验证
【发布时间】:2010-09-22 16:46:25
【问题描述】:

我正在 Google App Engine 上构建一个站点,运行 python 和 Django non-rel。一切都适用于 HTML 和发布/阅读数据。但随着我的进步,我希望使用 AJAX 进行许多更新,最终还会通过 Android 和 iPhone 等移动设备进行更新。

我的页面使用 django non-rel 并且我的登录/注销身份验证非常适合 HTML。但是通过 JSON 发送的更新信息必须经过身份验证,用户才能进行更改。我知道只为 AJAX 调用进行身份验证不会太困难,因为您仍在访问网站,但是在进行手机身份验证时呢?

所以我是新手,我从哪里开始?

如何在 gae 上设置服务,以便进行经过身份验证的 CRUD 操作?理想情况下,我想为 ajax、android 等使用完全相同的 REST 服务。

【问题讨论】:

    标签: python json google-app-engine authentication django-nonrel


    【解决方案1】:

    Python 使这变得非常简单,您只需创建一个装饰器方法来检查身份验证并将装饰器添加到任何需要身份验证凭据的方法中。

    def admin(handler_method):
      """
      This decorator requires admin, 403 if not.
      """
      def auth_required(self, *args, **kwargs):
        if users.is_current_user_admin():
          handler_method(self, *args, **kwargs)
        else:
          self.error(403)
      return auth_required
    
    ...
    
    @admin
    def crudmethod_update(self, *args, **kwargs):
      ...
    

    请注意,这假设了一些关于您如何获取用户数据等的事情,但任何设置的主体都是相同的。您可能正在努力的概念是,ajax 调用在服务器上的处理方式有所不同,但就像任何宁静的方法一样,您确实获得了相同的标头。如果您可以检查标准 html 请求的身份验证,则可以完全使用 ajax 请求劫持表单提交并返回相同的结果。您可能想要取回 JSON 或一小段 HTML,为此您想要:

    1. 添加一些可以在请求中检查的内容,以了解它是一个 ajax 请求并进行相应调整。

    2. 具体实现RPC Model for handling ajax requests。

    对于实际处理身份验证,您可以使用 google.appengine.ext users 库并使用 google 帐户身份验证,或者您可以编写自己的身份验证。 Writing your own 当然意味着实现session mechanism(用于在整个用户会话中保留状态)并将密码存储在哈希和加盐状态以进行验证。

    【讨论】:

    • 我想我迷路的地方是我应该如何检查身份验证?那么在你的 user.is_current_user_admin 函数中,它是如何通过 URL 来检查你是不是正确的人呢?假设我有一个名为 GetMyData 的函数,并且我在 url 中传入了 userID,例如 www.site.com/json/mydata/123。当服务器收到这个请求时,它应该首先检查这个请求是否经过身份验证,但是它如何知道它是否仅通过 URL 进行了身份验证?我觉得我错过了一大块拼图,非常感谢你的帮助。谢谢!
    • adam,您缺少的部分是基于 cookie 的身份验证令牌。您的登录函数应该生成一个加密安全的伪随机数,用作用户会话的身份验证令牌。然后,该令牌可以通过 cookie 机制在用户和服务器之间来回传递。您的浏览器会自动处理这些 cookie,但是当您为移动设备编写应用程序时,您需要自己处理它们。您将检查此“authToken”cookie(在服务器上)的值,以确定用户是否已登录
    • 我还应该注意到,Django 包含几个开箱即用的装饰器,例如上面提到的@admin 装饰器。例如,@login_required 是一个非常有用的装饰器,它包含在 Django 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多