Commit 413d7ce1 by Raphael Lullis

Adding authentication methods, and figured out that Parse does return…

Adding authentication methods, and figured out that Parse does return sessionToken info if requests are made with master key set, so I'm adding a new way to setup the connection. Before any interaction with Parse, simply call ParseBase.register(app_id, rest_key, **optional_keys) and it will save them. So the library now becomes usable for applications both with or without the master key.
parent c54dd05f
......@@ -44,17 +44,26 @@ class ResourceRequestNotFound(ParseError):
'''Request returns a 404'''
pass
def master_key_required(func):
'''decorator describing methods that require the master key'''
def ret(obj, *args, **kw):
conn = ParseBase.CONNECTION
if not (conn and conn.get('master_key')):
message = '%s requires the master key' % func.__name__
raise ParseError(message)
func(obj, *args, **kw)
return ret
class ParseBase(object):
ENDPOINT_ROOT = API_ROOT
@classmethod
def register(cls, app_id, rest_key, master_key, **kw):
def register(cls, app_id, rest_key, **kw):
ParseBase.CONNECTION = {
'APPLICATION_ID': app_id,
'REST_API_KEY':rest_key,
'MASTER_KEY': master_key
'app_id': app_id,
'rest_key': rest_key
}
ParseBase.CONNECTION.update(**kw)
@classmethod
......@@ -63,8 +72,9 @@ class ParseBase(object):
raise ParseError('Missing connection credentials')
app_id = ParseBase.CONNECTION.get('APPLICATION_ID')
rest_key = ParseBase.CONNECTION.get('REST_API_KEY')
app_id = ParseBase.CONNECTION.get('app_id')
rest_key = ParseBase.CONNECTION.get('rest_key')
master_key = ParseBase.CONNECTION.get('master_key')
headers = extra_headers or {}
url = uri if uri.startswith(API_ROOT) else cls.ENDPOINT_ROOT + uri
......@@ -75,20 +85,23 @@ class ParseBase(object):
request = urllib2.Request(url, data, headers)
request.add_header('Content-type', 'application/json')
request.add_header("X-Parse-Application-Id", app_id)
request.add_header("X-Parse-REST-API-Key", rest_key)
request.add_header('X-Parse-Application-Id', app_id)
request.add_header('X-Parse-REST-API-Key', rest_key)
if master_key: request.add_header('X-Parse-Master-Key', master_key)
request.get_method = lambda: http_verb
try:
response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
raise {
exc = {
400: ResourceRequestBadRequest,
401: ResourceRequestLoginRequired,
403: ResourceRequestForbidden,
404: ResourceRequestNotFound
}.get(e.code, ParseError)
raise exc(e.read())
return json.loads(response.read())
......
......@@ -24,9 +24,11 @@ except ImportError:
sys.exit('You must create a settings_local.py file with APPLICATION_ID, ' \
'REST_API_KEY, MASTER_KEY variables set')
parse_rest.APPLICATION_ID = getattr(settings_local, 'APPLICATION_ID', '')
parse_rest.REST_API_KEY = getattr(settings_local, 'REST_API_KEY', '')
parse_rest.MASTER_KEY = getattr(settings_local, 'MASTER_KEY', '')
parse_rest.ParseBase.register(
getattr(settings_local, 'APPLICATION_ID'),
getattr(settings_local, 'REST_API_KEY'),
master_key=getattr(settings_local, 'MASTER_KEY')
)
GLOBAL_JSON_TEXT = """{
"applications": {
......
......@@ -39,15 +39,17 @@ class User(ParseResource):
'username', 'sessionToken']
def is_authenticated(self):
return self.authenticate(self.sessionToken)
return self.sessionToken is not None
def authenticate(self, session_token):
self.sessionToken = session_token
try:
self.save()
return True
except:
return False
def authenticate(self, password=None, session_token=None):
if self.is_authenticated(): return
if password is not None:
self = User.login(self.username, password)
user = User.retrieve(self.objectId)
if user.objectId == self.objectId and user.sessionToken == session_token:
self.sessionToken = session_token
@login_required
def save(self):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment