我开始编写一个应用程序,移动应用程序(Android/IPhone(将通过使用JSON的一系列Web API调用与GAE后端(Python(进行通信。
我不能使用Google帐户进行身份验证,所以我需要实现自己的身份验证。我知道如何做到这一点,但我不确定是否有更好的方法。
有人能提供一些代码示例/如何实现以下目标的建议吗?
方法
- 移动应用程序在服务器上调用Login方法,该方法在商店中验证并创建会话密钥,并将其返回给应用程序-不确定如何生成密钥/会话,也不确定请求/响应的位置
- 在每次调用时,应用程序都会将此密钥传递给服务器进行身份验证,如果通过,则允许操作
- 用户不应该再次登录手机,除非他们明确注销或丢失密钥
登录方法-不生成密钥
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
我不明白你为什么需要会话?应用程序引擎上的会话被保存在数据存储中,所以如果你能让你的请求保持无状态,我鼓励你这样做
由于您将拥有自己的用户服务来对用户进行身份验证,因此我建议您使用摘要式身份验证,因为请求中从未包含机密。
大多数客户端和服务器平台都有实现摘要的库。
如果您不明确希望使用会话等,您可以简单地使用数据存储。尝试以下操作:
- 获取唯一的设备ID/电子邮件以识别每个唯一的用户
- 根据特定用户的请求,生成一个随机身份验证密钥,并将其存储在用户的电子邮件/设备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就好了。