22
33import uuid
44import logging
5+ from datetime import datetime , timedelta
56try : # Python 2.x
67 import urlparse
78 from urllib import urlencode
@@ -143,11 +144,14 @@ def __init__(self, state=None):
143144 self .app_secret = None
144145 self .access_token = None
145146 self .refresh_token = None
147+ self .expires_at = None
146148
147149 super (FHIROAuth2Auth , self ).__init__ (state = state )
148150
149151 @property
150152 def ready (self ):
153+ if self .expires_at and self .expires_at < datetime .now ():
154+ self .reset ()
151155 return True if self .access_token else False
152156
153157 def reset (self ):
@@ -283,6 +287,8 @@ def _request_access_token(self, server, params):
283287 del ret_params ['access_token' ]
284288
285289 if 'expires_in' in ret_params :
290+ expires_in = ret_params .get ('expires_in' )
291+ self .expires_at = datetime .now () + timedelta (seconds = expires_in )
286292 del ret_params ['expires_in' ]
287293
288294 # The refresh token issued by the authorization server. If present, the
@@ -298,6 +304,29 @@ def _request_access_token(self, server, params):
298304 return ret_params
299305
300306
307+ # MARK: Authorization
308+
309+ def authorize (self , server ):
310+ """ Perform authorization on behalf of a system.
311+
312+ :param server: The Server instance to use
313+ """
314+ logger .debug ("SMART AUTH: Get access token" )
315+ token_params = self ._token_params (server )
316+ return self ._request_access_token (server , token_params )
317+
318+ def _token_params (self , server ):
319+ """ The URL parameters to use when requesting access token. """
320+ if server is None :
321+ raise Exception ("Cannot get token params without server instance" )
322+
323+ params = {
324+ 'grant_type' : 'client_credentials' ,
325+ 'scope' : server .desired_scope ,
326+ }
327+ return params
328+
329+
301330 # MARK: Reauthorization
302331
303332 def reauthorize (self , server ):
0 commit comments