2

誰がログインしているか、ログインしている時間、どこからログインしているかなど、GAE アプリからユーザーを追跡したいと考えています。Google が提供する認証メカニズムを使用してこれを行う良い方法は何だろうと思っています。

デコレーターと制約を簡単に追加しapp.yamlて、ユーザーがログインしている場合にのみ特定のエンドポイントにアクセスできるようにすることができます。ただし、これでは必要な情報が得られません。

明らかに、Google は内部でセッション管理を行っています。何らかの方法でこれと対話することは可能ですか? そうでない場合、上記の情報を追跡するために活用できる、試行錯誤された他のアプローチはありますか?

4

1 に答える 1

0

ユーザーがログインしたら、そのユーザーをデータストア内でアクティブとしてフラグを立て、必要なセッション情報を保存するために memcache を使用します。次に、アクティブなユーザーをチェックし、非アクティブなセッション (つまり、20 分ほど前) からデータを保存する通常のジョブを実行します。 ) データストアに。

ユーザーの開始時刻と終了時刻を追跡する例を次に示します。

def setUserSession(user):
    date = datetime.datetime.today()
    user_session = memcache.get("UserSession%s" % user.user_id())
    if user_session is not None:
        user_session = user_session.split(",")
        memcache.replace("UserSession%s" % user.user_id(),"%s,%s" %(user_session[0],date.strftime("%Y-%m-%d %H:%M:%S")))
    else:
        memcache.set("UserSession%s" % user.user_id(),"%s,%s" %(date.strftime("%Y-%m-%d %H:%M:%S"), date.strftime("%Y-%m-%d %H:%M:%S")))
        profile = db.GqlQuery("SELECT * FROM UserProfile WHERE User = :1", user).get()
        if profile:
            profile.LastSession = date
            profile.IsActive = True
            profile.put()
        else:
            profile = UserProfile()
            profile.User = user
            profile.FirstSession = date
            profile.LastSession = date
            profile.IsActive = True
            profile.put()

def collectUserSessions():
    active_users = db.GqlQuery("SELECT * FROM UserProfile WHERE IsActive = :1", True)
    for u in active_users:
        session = memcache.get("UserSession%s" % u.User)
            if session:
                session = session.split(',')
                last_active = parseDate(session[1]) #parses string into datetime object
                if date - datetime.timedelta(minutes=20) > last_active:
                    record = SessionHistory()
                    record.User = u.User
                    record.SessionStart = parseDate(session[0])         
                    record.SessionEnd = last_active
                    record.put()
                    memcache.delete("UserSession%s" % u.User)                       
                    u.LastSession = last_active
                    u.IsActive = False
                    u.put()
            else:
                u.IsActive = False
                u.put()
于 2011-10-14T22:08:48.660 に答える