Note that there are some explanatory texts on larger screens.

plurals
  1. POGoogle Endpoints API + Chrome Extension returns None for endpoints.get_current_user().user_id()
    primarykey
    data
    text
    <p>I am developing Google App Engine application written in Python and using Endpoints API. In conjunction, I am writing a Chrome Extension to interact with the Endpoints API. I've been running into lots of issues with the Endpoints API and authorization. Currently, here is my setup:</p> <h2>Endpoints API (Python)</h2> <pre><code>from google.appengine.ext import endpoints from protorpc import message_types from protorpc import remote ALLOWED_CLIENT_IDS = ['client_id_from_google_api_console', endpoints.API_EXPLORER_CLIENT_ID] @endpoints.api(name='my_api',version='v1', description='My API', allowed_client_ids=ALLOWED_CLIENT_IDS) class MyApi(remote.Service): @endpoints.method(message_types.VoidMessage, DeviceListResponse, name='user.device.list', path='user/device/list', http_method='GET') def user_device_list(self, request): current_user = endpoints.get_current_user() if current_user is None: raise endpoints.UnauthorizedException('You must authenticate first.') if current_user.user_id() is None: raise endpoints.NotFoundException("Your user id was not found.") return DeviceListResponse(devices=[]) #Hypothetically return devices api_service = endpoints.api_server([MyApi], restricted=False) </code></pre> <h2>Google API Console</h2> <p>The JS origins include: chrome-extensions://chrome_app_id</p> <h2>CHROME EXTENSION (JS)</h2> <pre><code>var apiRoot = "https://my_app_id.appspot.com/_ah/api"; var clientID = "client_id_from_google_api_console"; var oauthScopes = ["https://www.googleapis.com/auth/userinfo.email"]; var responseType = "token id_token"; //Helper method to log to the console function l(o){console.log(o);} function oauthSignin(mode) { gapi.auth.authorize({client_id: clientID, scope: oauthScopes, immediate: mode, response_type: responseType}, function() { var request = gapi.client.oauth2.userinfo.get(); request.execute(function(resp) { authenticated = !resp.code; if(authenticated) { var token = gapi.auth.getToken(); token.access_token = token.id_token; gapi.auth.setToken(token); l("Successfully authenticated. Loading device list"); gapi.client.my_api.user.device.list({}).execute(function(resp) { if(resp.code) { l("Response from device list: " + resp.message); } l(resp); }); } }); }); } //This get's called when the page and js library has loaded. function jsClientLoad() { l("JS Client Libary loaded. Now loading my_api and oauth2 APIs."); var apisToLoad; var callback = function() { if (--apisToLoad == 0) { l("APIs have loaded.") oauthSignin(true); } else { l("Waiting for " + apisToLoad + " API" + (apisToLoad&gt;1?"s":"") + " to load."); } } apisToLoad = 2; // must match number of calls to gapi.client.load() gapi.client.load('my_api', 'v1', callback, apiRoot); gapi.client.load('oauth2', 'v2', callback); } </code></pre> <h2>Result</h2> <p>Now that I have shown the main chunk of my code (note, I had to change it a bit to make sense without uploading entire code), if I go to the Google API Explorer and run that method, I get a 200 response. If I run it in the Chrome Extension, I get a 404 code with the message "Your user id was not found.".</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload