如何使用 Google 在 Appengine 上的默认身份验证跟踪会话(会话持续时间、用户登录位置等)?



我想从我的GAE应用程序跟踪我的用户-谁登录,他们登录了多长时间,他们从哪里登录等。我想知道使用Google提供的身份验证机制来做到这一点的好方法。

我可以很容易地在app.yaml中添加装饰器和约束,以确保只有在用户登录时才能访问特定的端点;然而,这并没有真正给我所需要的信息。

显然,谷歌在后台做会话管理——有可能以任何方式与之交谈吗?如果没有,是否有其他经过尝试和测试的方法,我可以利用这些方法来跟踪上述信息?

当用户登录时,将该用户标记为数据存储中的活动用户,使用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()

最新更新