2013-04-21 6 views
14

Ho un'API Endpoint distribuita su App Engine. Non ho problemi a utilizzare Google API Explorer per effettuare richieste ai metodi API che NON richiedono l'accesso. L'URL che sto utilizzando è:Come utilizzare Google API Explorer per testare i miei endpoint di App Engine utilizzando OAuth?

https://developers.google.com/apis-explorer /?base=https://[MY_APP_ID].appspot.com/_ah/api

Dove sono bloccato sta chiamando metodi API che richiedono all'utente di effettuare il login, come questa:

@ApiMethod(name = "config.get", 
     clientIds = {"[MY_CLIENT_ID].apps.googleusercontent.com", "com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID"}, 
     audiences = {"[MY_APP_ID].appspot.com"}, 
     scopes = {"https://www.googleapis.com/auth/userinfo.email"}) 
public Config getConfig(User user) throws OAuthRequestException { 
    log.fine("user: " + user); 

    if (user == null) { 
     throw new OAuthRequestException("You must be logged in in order to get config."); 
    } 

    if (!userService.isUserAdmin()) { 
     throw new OAuthRequestException("You must be an App Engine admin in order to get config."); 
    } 
    ... 

Nell'API Explorer c'è un interruttore in alto a destra che, quando si fa clic, mi consente di specificare gli ambiti e autorizzare. Lo faccio solo con l'ambito userinfo.email controllato. Non fa differenza. La risposta che ricevo da mia chiamata è:

503 Service Unavailable 

- Show headers - 

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "backendError", 
    "message": "java.lang.IllegalStateException: The current user is not logged in." 
    } 
    ], 
    "code": 503, 
    "message": "java.lang.IllegalStateException: The current user is not logged in." 
} 
} 

Ai tempi in cui endpoint era in fase di Trusted Tester, mi ricordo che ci sia un passo manuale nel OAuth2 Playground per ottenere un ID di token invece di un token di accesso o qualcosa del genere . Se ciò è ancora necessario, qualsiasi menzione di ciò sembra essere scomparsa dai documenti di Endpoints ora e ora vedo anche il modo per scambiare i token nell'API Explorer.

+0

Oh, e ho anche aggiunto il campo giochi OAuth (https://developers.google.com/oauthplayground) all'elenco di URI di reindirizzamento nella console API. – Eliot

risposta

12

Vedo che hai tra virgolette. Se questo non è un refuso nella trascrizione di Stack Overflow, questo è un problema. Il valore è già una stringa, quindi stai semplicemente passando il testo com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID (non l'ID cliente effettivo) come ambito autorizzato. Quello non funzionerà. Prova a modificare:

@ApiMethod(name = "config.get", 
     clientIds = {"[MY_CLIENT_ID].apps.googleusercontent.com", com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID}, 
     audiences = {"[MY_APP_ID].appspot.com"}, 
     scopes = {"https://www.googleapis.com/auth/userinfo.email"}) 

Edit: isUserAdmin è supportato all'interno di endpoint, ed è probabile che una causa secondaria di errori. Suggerirei di archiviare una richiesta di funzionalità per supportare questo metodo sull'oggetto Utente fornito (probabilmente non forniremo supporto per il servizio utente stesso, quindi è separato dal login OAuth.)

+0

Buona individuazione! Hanno riparato e ridistribuito ma non sembra aver fatto alcuna differenza. Era certamente rotto ma c'è anche qualcos'altro rotto. – Eliot

+0

Non riesco a riprodurre questo problema utilizzando codice di esempio quasi identico. Il codice nella tua domanda iniziale è quello che stai usando ora? È curioso che tu stia ricevendo un 503 invece di un 401, che è ciò che OAuthRequestException dovrebbe mappare (vedo un 401 quando eseguo il test personalmente). –

+0

Questo è sicuramente ciò che viene distribuito. Se premo questo metodo senza essere loggato, ottengo un 401 come te. Se poi effettuo l'accesso utilizzando il pulsante OAuth2 su API Explorer e lo premo di nuovo, ottengo un 503. Tuttavia, se premo * un altro * metodo Endpoint che ho bisogno, che richiede l'accesso dell'utente, ma NON include alcun uso del servizio utente di App Engine, funziona correttamente. Non posso usare cose come UserService.isUserAdmin() in Endpoint? Presumibilmente questa roba è ancora basata su sessioni HTTP piuttosto che su token di accesso OAuth? – Eliot

0

Non so quando questo è stato introdotto, ma se si utilizza OAuth2, invece di UserService.isUserAdmin() è possibile utilizzare OAuthServiceFactory.getOAuthService().isUserAdmin(EMAIL_SCOPE) dove EMAIL_SCOPE è "https://www.googleapis.com/auth/userinfo.email".

Ciò rende più facile da usare il vecchio OpenID o OAuth2:

boolean isAdmin = false; 
try { 
    isAdmin = userService.isUserAdmin()); 
} catch (IllegalStateException e1) { 
    try { 
    isAdmin = OAuthServiceFactory.getOAuthService().isUserAdmin(EMAIL_SCOPE); 
    } catch (Exception e2) {} 
} 

La domanda iniziale è stato chiesto diversi anni fa, ma forse questo aiuterà gli altri.