1

私のアプリでは、ユーザーは自分のGoogleアカウントを使用してログインする必要があります。

App.yampファイルに次のセットがあります。

  • URL:/user/.*
    スクリプト:user.py
    ログイン:必須

これで、ユーザーが/user/secret.pyの下のファイルにアクセスしようとすると、Googleを介して認証する必要があります。これにより、認証が成功した後、ユーザーは/user/secret.pyにリダイレクトされます。今私が直面している問題は、ユーザーがアプリにリダイレクトされたときです。これがユーザーが初めてログインしたのか、それともユーザーだけから再び戻ってきた私のサイトの通常のユーザーなのかはわかりません。 googleがusers.get_current_user()を使用して渡すオブジェクト。

したがって、ユーザーがすでに存在するかどうかを毎回確認するために、データストアの状態を維持する必要があります。彼が存在しない場合は、他のアプリケーション固有の設定で新しいエントリを作成する必要があります。

私の質問は:これを処理する簡単な方法はありますか?これが初めてのユーザーなのか通常のユーザーなのかを判断するためにデータストアにクエリを実行する必要はありませんか?

4

4 に答える 4

2

私は自分のユーザーとセッション管理を使用する傾向があります

私のWebハンドラーには、sessionというデコレーターとauthorizeというデコレーターをアタッチします。セッションデコレータはすべてのリクエストにセッションを添付し、承認デコレータはユーザーが承認されていることを確認します

(注意点として、承認デコレータは、アプリケーションの開発方法に固有です。ほとんどのリクエストでは、ユーザー名が最初のパラメーターです)

したがって、たとえば、Webハンドラーは次のようになります。

class UserProfile(webapp.RequestHandler):
  @session
  @authorize
  def get(self, user):
     # Do some funky stuff
     # The session is attached to the self object.
     someObjectAttachedToSession = self.SessionObj.SomeStuff
     self.response.out.write("hello %s" % user)

上記のコードでは、セッションデコレータは、リクエストに存在するCookieに基づいて必要なセッションのものをいくつか添付します。authorizeヘッダーは、セッションが正しい場合にのみユーザーがページにアクセスできるようにします。

デコレータコードは次のとおりです。

import functools
from model import Session
import logging

def authorize(redirectTo = "/"):
    def factory(method):
        'Ensures that when an auth cookie is presented to the request that is is valid'
        @functools.wraps(method)
        def wrapper(self, *args, **kwargs):

            #Get the session parameters
            auth_id = self.request.cookies.get('auth_id', '')
            session_id = self.request.cookies.get('session_id', '')

            #Check the db for the session
            session = Session.GetSession(session_id, auth_id)           

            if session is None:
                self.redirect(redirectTo)
                return
            else:
                if session.settings is None:
                    self.redirect(redirectTo)
                    return

                username = session.settings.key().name()

                if len(args) > 0:               
                    if username != args[0]:
                        # The user is allowed to view this page.
                        self.redirect(redirectTo)
                        return

            result = method(self, *args, **kwargs)

            return result
        return wrapper
    return factory

def session(method):
    'Ensures that the sessions object (if it exists) is attached to the request.'
    @functools.wraps(method)
    def wrapper(self, *args, **kwargs):

        #Get the session parameters
        auth_id = self.request.cookies.get('auth_id', '')
        session_id = self.request.cookies.get('session_id', '')

        #Check the db for the session
        session = Session.GetSession(session_id, auth_id)           

        if session is None:
            session = Session()
            session.session_id = Session.MakeId()
            session.auth_token = Session.MakeId()
            session.put()

        # Attach the session to the method
        self.SessionObj = session           

        #Call the handler.          
        result = method(self, *args, **kwargs)

        self.response.headers.add_header('Set-Cookie', 'auth_id=%s; path=/; HttpOnly' % str(session.auth_token))
        self.response.headers.add_header('Set-Cookie', 'session_id=%s; path=/; HttpOnly' % str(session.session_id))

        return result
    return wrapper

def redirect(method, redirect = "/user/"):
    'When a known user is logged in redirect them to their home page'
    @functools.wraps(method)
    def wrapper(self, *args, **kwargs):
        try:    
            if self.SessionObj is not None:
                if self.SessionObj.settings is not None:
                    # Check that the session is correct
                    username = self.SessionObj.settings.key().name()

                    self.redirect(redirect + username)
                    return
        except:
            pass
        return method(self, *args, **kwargs)
    return wrapper
于 2009-06-23T15:34:29.173 に答える
1

ユーザーが初めてログインしてこれを確認するときに、Cookieを設定するだけではいけませんか?彼らが新しいユーザーである場合、それはそこにありませんが、彼らが古いユーザーである場合、それはあります。一部のユーザーはCookieをクリアする可能性があるため、100%正確ではありませんが、達成したい内容によってはクリアされる場合があります。

アプリケーションでDjangoを使用している場合、Cookieの管理は非常に簡単です。

于 2009-06-23T10:42:59.153 に答える
1

独自の認証済みユーザーを管理することが、この問題に取り組む最善の方法であることに同意します。明らかにアプリケーションの範囲によって異なりますが、少なくとも、アカウントでログインしたユーザーの UserProperty を含む AuthUser(Model) クラス。

...
class AuthUser(db.Model):
  user = UserProperty(required=True)
...

次に、ユーザーがログインすると

...
user = users.get_current_user()
user_exists = AuthUser.gql('where user = :1', user) # or easy check db.GqlQuery("select __key__ from AuthUser where user = :1", user)
if user_exists:
  # do user has been before stuff
else:
  # do first time user stuff
...

または、これを行うための非常に簡単な方法は、ListProperty(users.User) を持つサイトのモデルを用意することです。その後、リストを簡単にチェックして、ユーザーが以前にアプリにアクセスしたことがあるかどうかを確認できます。

...
class SiteStuff(db.Model):
  auth_users = ListProperty(users.User)
...

そして彼らがログインするとき:彼らがリストにあるかどうかを確認してください。そうでない場合は、それらをリストに追加し、put() して、初めてのユーザーのために必要なことを行います。そこにそれらを見つけたら、他のことをしてください。

于 2010-04-18T06:40:17.763 に答える