2011-08-11 9 views
2

私はpythonとGoogleのアプリケーションエンジンを使用しています。私はタスクキューを使用したいと思います。タスクキューハンドラの一部として、現在のユーザが管理者(ユーザサービスを使用している)かどうかを確認します。このテストは常に失敗します。このテストに合格する方法はありますか?Googleアプリケーションエンジンのタスクキューとユーザーサービス

update:さらに混乱を避けるため、タスクを起動したユーザーが管理者であるかどうかを確認しようとしています(これは単なる例です)。私は、タスクがサーバーから実行されていることを理解しており、すべてのユーザーのCookieは長くなくなっています。だから私は、ホッピングされた答えはタスク

import logging 
from google.appengine.api import users 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 
from google.appengine.api import taskqueue 

class MyRequesHandler(webapp.RequestHandler): 
    def get(self): 
     taskqueue.add(url="/task/") 

class MyTaskHandler(webapp.RequestHandler): 
    def post(self): 
     if users.is_current_user_admin(): 
      logging.debug("admin") 
     else: 
      logging.debug("not admin") 


def main(): 
    logging.getLogger().setLevel(logging.DEBUG) 
    application = webapp.WSGIApplication([ 
      ('/', MyRequesHandler), 
      ('/task/', MyTaskHandler) 
     ], 
     debug=True) 
    run_wsgi_app(application) 

答えて

5

にセッションを転送する方法だったユーザーAPIは、現在の要求のためにログインしているユーザーの詳細を反映しており、明らかにタスクキューのタスクの場合、タスクキューシステムによって開始されるため、ユーザーは存在しません。このチェックは、タスクをエンキューする前に実行し、結果をフラグとしてタスクに渡す必要があります。

1

タスクを特定の目的で実行するには、データストアIDまたはキー(またはユーザーの他の識別子)をペイロードとしてタスクに転送します。

class MyRequesHandler(webapp.RequestHandler): 
    def get(self): 
     taskqueue.add(url="/task/do_something", params={'user_email': users.get_current_user().email()}) 

class MyTaskHandler(webapp.RequestHandler): 
    def post(self): 
     user_email = self.request.POST.get('user_email') 
     user = User.all().filter('email', user_email).get() 
     # ... do something on behalf of user 

これは明らかに外部の不正アクセスからタスクのURLを保護する必要になる - これはapp.yamlで行うことができます

handlers: 
    - url: /task/(.*) 
     script: tasks.py 
     login: admin 

タスクキューは、管理者のログインを必要とするURLにアクセスして問題ありません。

0

タスクキュー項目を実行するときに、元のユーザーはユーザーサービスで利用できません。ただし、タスクを作成するときは、元のユーザーのIDを要求の一部として含めることができます。

外部ユーザーがタスク実行中にこのユーザーIDを改ざんするのを防ぐには、X-AppEngine-QueueNameリクエストヘッダーを探します。このヘッダーは​​であり、外部ユーザーが偽装することはできません。

関連する問題