使用Android/IPhone在谷歌应用程序引擎上处理会话



我开始编写一个应用程序,移动应用程序(Android/IPhone(将通过使用JSON的一系列Web API调用与GAE后端(Python(进行通信。

我不能使用Google帐户进行身份验证,所以我需要实现自己的身份验证。我知道如何做到这一点,但我不确定是否有更好的方法。

有人能提供一些代码示例/如何实现以下目标的建议吗?

方法

  1. 移动应用程序在服务器上调用Login方法,该方法在商店中验证并创建会话密钥,并将其返回给应用程序-不确定如何生成密钥/会话,也不确定请求/响应的位置
  2. 在每次调用时,应用程序都会将此密钥传递给服务器进行身份验证,如果通过,则允许操作
  3. 用户不应该再次登录手机,除非他们明确注销或丢失密钥

登录方法-不生成密钥

class Login(webapp.RequestHandler):
def post(self):
    args = json.loads(self.request.body)
    email = args['e']
    pwd = args['p']
    ret = {}
    user = User.gql('WHERE email = :1', email).get()
    if user and helpers.check_password(pwd, user.password):
        ret['ret_code'] = 0
        ret['dn'] = user.display_name
    else:
        ret['ret_code'] = 1
    self.response.headers['Content-Type'] = 'application/json'
    self.response.out.write(json.dumps(ret))

我认为您应该使用webapp2提供的功能来实现您的自定义注册。

from webapp2_extras import auth
from google.appengine.api import users
class RegisterHandler(webapp2.RequestHandler):
    def post(self):
        email=self.request.POST['email']
        password=self.request.POST['password']
        #Let webapp2 handle register and manage session
        user = auth.get_auth().store.user_model.create_user('own:'+str(email), password_raw=password,email=email)
        #user (True, User(key=Key('User', 80001), auth_ids=[u'own:useremail@mail.com'],email='useremail@mail.com',password=u'hashed_password',...))
        if not user[0]: #user is a tuple
            self.response.write(user[1]) # Error message
        else:
            #You can extend your User Model e.g UserProfile(User): or have a UserProperty in your profile model as the example.  
            profile=UserProfile(user=users.User(user[1].email)).put()
            self.response.write(str(profile.key()))
class LoginHandler(webapp2.RequestHandler): 
    def post(self):
        email = self.request.POST.get('email')
        email = self.request.POST.get('password')
        # Try to login user with password
        # Raises InvalidAuthIdError if user is not found
        # Raises InvalidPasswordError if provided password doesn't match with specified user
        try:
            auth.get_auth().get_user_by_password('own:'+email, password)
            #Return user_session with User id, 
        except InvalidPasswordError, InvalidAuthIdError:
            #Error

您可以通过以下方式检查用户登录:

if auth.get_user_by_session():
    #Logged in      
else:
    #Not logged in

在您的客户端应用程序(Android、IOS(上。您只需要存储响应cookie并为每个子序列请求发送它。

祝你好运:(

看看webapp2和webapp2的附加功能以及会话、auth和JSON

我不明白你为什么需要会话?应用程序引擎上的会话被保存在数据存储中,所以如果你能让你的请求保持无状态,我鼓励你这样做

由于您将拥有自己的用户服务来对用户进行身份验证,因此我建议您使用摘要式身份验证,因为请求中从未包含机密。

大多数客户端和服务器平台都有实现摘要的库。

如果您不明确希望使用会话等,您可以简单地使用数据存储。尝试以下操作:

  1. 获取唯一的设备ID/电子邮件以识别每个唯一的用户
  2. 根据特定用户的请求,生成一个随机身份验证密钥,并将其存储在用户的电子邮件/设备ID中,可能还有当前时间戳和loggedIn标志

所以你有:

User email/id: someone@example.com
password: xxxxxxxxxx
Key : 2131231312313123123213
Timestamp: 20:00 12-02-2013
loggedIn : boolean value

这可以是数据库模型。现在,每当用户登录时:

  • 检查电子邮件、密码组合
  • 如果有效,生成随机密钥,并使用新密钥更新数据存储
  • 使用当前时间更新时间戳,并将loggedIn设置为True
  • 现在,将密钥以JSON对象的形式返回给客户端(Android/iPhone(

现在,对于每个请求,将接收的密钥与数据存储中的密钥进行检查,如果loggedIn标志设置为true。如果两者都正常,则处理请求。

此外,在注销时:

  • 只需将数据存储中的loggedIn标志设置为False

希望这有帮助:(

尝试gae会话进行会话管理。它为您创建安全的cookie,并允许您轻松地将数据与每个用户关联起来。只需为初始身份验证提供您自己的逻辑。

它是专门为应用程序引擎构建的,非常受欢迎,而且速度极快/可扩展。

https://github.com/dound/gae-sessions

有很多方法可以做到这一点。

1( 当您检查用户登录详细信息时,如果它已检出,则可以创建一个随机UUID或字符串,并将User对象存储在memcache中,其中随机字符串作为Key,User对象作为值。然后返回随机字符串和响应头。在移动设备上,当您解析响应时,获取此标头并将其存储在本地缓存中。在所有进一步的请求中,继续在请求标头中发送此密钥,并在控制器中使用此密钥从memcache获取User对象,然后继续。如果对象不在memcache中,您可以发回一个响应,提示用户登录

2( 如果你不想使用memcache,你可以将User对象存储在会话中和客户端,同时解析响应,从响应中获取会话id。它通常是JSESSIONID。然后将其存储起来,并随进一步的请求重新发送。在控制器中,您可以检查当前会话是否具有用户对象else强制登录。

1( 另一种方法是将appengine密钥与响应一起返回给用户并重新发送

只需谷歌从响应中获取响应标头。然后获取SESSIONID/JESSIONID头,存储并将具有相同名称和值的字段添加到所有其他请求头中。那是最简单的方法。

我的第一个答案是stackoverflow,没有代码考试,如果我知道python就好了。

最新更新