2013-03-28 15 views
6

Sto implementando Cloud Endpoints con un'applicazione Python che utilizza l'autenticazione personalizzata (GAE Sessions) anziché Google Account. Ho bisogno di autenticare le richieste provenienti dal client Javascript, quindi mi piacerebbe avere accesso alle informazioni sui cookie.Cookie HTTP Cloud Endpoint

La lettura this other question mi porta a credere che sia possibile, ma forse non documentato. Non ho familiarità con il lato Java di App Engine, quindi non sono sicuro di come tradurre lo snippet in Python. Ecco un esempio di uno dei miei metodi:

class EndpointsAPI(remote.Service): 
    @endpoints.method(Query_In, Donations_Out, path='get/donations', 
        http_method='GET', name='get.donations') 
    def get_donations(self, req): 
    #Authenticate request via cookie 

dove Query_In e Donations_Out sono entrambi i messaggi ProtoRPC (messages.Message). Il parametro req nella funzione è solo un'istanza di Query_In e non ho trovato alcuna proprietà correlata ai dati HTTP, tuttavia potrei sbagliarmi.

risposta

13

In primo luogo, vorrei incoraggiarvi a provare a usare OAuth 2.0 dal vostro client come è fatto nel Tic Tac Toe sample.

I cookie sono inviati al server nell'intestazione cookie e questi valori sono in genere impostati in ambiente WSGI con i tasti 'HTTP_...' dove ... corrisponde al nome di intestazione:

http = {key: value for key, value in os.environ.iteritems() 
     if key.lower().startswith('http')} 

Per i biscotti, os.getenv('HTTP_COOKIE') vi darà il valore dell'intestazione che cerchi. Sfortunatamente, questo non viene passato attraverso l'infrastruttura API di Google per impostazione predefinita.

UPDATE: Questo è stato abilitato per le applicazioni Python as of version 1.8.0.Per inviare i cookie attraverso, specificare quanto segue:

from google.appengine.ext.endpoints import api_config 

AUTH_CONFIG = api_config.ApiAuth(allow_cookie_auth=True) 

@endpoints.api(name='myapi', version='v1', auth=AUTH_CONFIG, ...) 
class MyApi(remote.service): 
    ... 

Questa è una (lista non necessariamente completo) di intestazioni che lo rendono attraverso:

  • HTTP_AUTHORIZATION
  • HTTP_REFERER
  • HTTP_X_APPENGINE_COUNTRY
  • HTTP_X_APPENGINE_CITYLATLONG
  • HTTP_ORIGIN
  • HTTP_ACCEPT_CHARSET
  • HTTP_ORIGINALMETHOD
  • HTTP_X_APPENGINE_REGION
  • HTTP_X_ORIGIN
  • HTTP_X_REFERER
  • HTTP_X_JAVASCRIPT_USER_AGENT
  • HTTP_METHOD
  • HTTP_HOST
  • HTTP_CONTENT_TYPE
  • HTTP_CONTENT_LENGTH
  • HTTP_X_APPENGINE_PEER
  • HTTP_ACCEPT
  • HTTP_USER_AGENT
  • HTTP_X_APPENGINE_CITY
  • HTTP_X_CLIENTDETAILS
  • HTTP_ACCEPT_LANGUAGE
+0

Qualche idea quando 'HTTP_COOKIE' sarà abilitato? Eseguo un'applicazione aziendale e non è possibile utilizzare Google OAuth come viene utilizzato nell'esempio Tic Tac Toe. Ho esplorato brevemente la creazione del mio provider OAuth2, ma mi è sembrato piuttosto goffo dal momento che gli utenti avrebbero dovuto eseguire l'autenticazione due volte. In ogni caso, l'intestazione 'HTTP_COOKIE' renderebbe la vita molto più semplice. Grazie! – rhefner1

+0

Ecco una patch per le scimmie che funzionerà per te: http://pastebin.com/jT7T6xPS Assicurati di sostituire 'api_config.ApiConfigGenerator' prima di creare il tuo' endpoints.api_server' per servire le richieste. – bossylobster

+1

Grazie Danny! Ha funzionato perfettamente. Presumo in base al messaggio 'logging.warn' che verrà corretto in 1.7.7, quindi è fantastico. – rhefner1

9

Per le persone che hanno l Java e qui. È necessario aggiungere la seguente annotazione, al fine di utilizzare i cookie in endpoint:

@Api(auth = @ApiAuth(allowCookieAuth = AnnotationBoolean.TRUE)) 

source

(senza che funzionerà sul server dev locale ma non sulla reale istanza GAE.)

+0

Questo mi aiuta molto quando utilizzo Spring Security con Cloud Endpoints. Aggiungendo solo questa istruzione endpoint usando la sessione, dove l'utente autenticato è stato impostato da SecurityContextPersistenceFilter – Pokuri

Problemi correlati