I’ve recently tried to switch my app engine app to using openID, but I’m having an issue authenticating with remote_api. The old authentication mechanism for remote_api doesn’t seem to work (which makes sense) – I’m getting a ‘urllib2.HTTPError: HTTP Error 302: Found’, which I assume is appengine redirecting me to the openid login page I’ve set up.
I guess I’m missing something fairly obvious. Currently my remote_api script has the following in it –
remote_api_stub.ConfigureRemoteDatastore(app_id=app_id, path='/remote_api', auth_func=auth_func, servername=host, secure=secure)
where auth_func is
def auth_func():
return raw_input('Username:'), getpass.getpass('Password:')
Any ideas what I need to supply to remote_api? I guess similar issues would be encountered with bulkloader too. Cheers,
Colin
This was a fun one.
Looking at remote_api, the flow for authentication seems to be something like this:
authtoken out of the response bodyACSIDcookie set in the responseACSIDcookie in subsequent requests that require authorizationI couldn’t find a lot of documentation on the new OpenID support, though Nick’s blog entry was informative.
Here’s the test app I wrote to see how things work:
app.yaml:
test.py:
Flipping my auth mode between Google Accounts and Federated Login, I noticed a few things:
ACSIDcookie is still produced at the end of the login process, only it comes from /_ah/openid_verify instead of /_ah/loginSo what’s happening with remote_api when using Federated Login? If we’re using the default appengine_rpc.HttpRpcServer, it’s dutifully following the same Google Account authentication process described at the top, only the app no longer considers the
ACSIDcookie returned by /_ah/login to be valid, so since you’re still unauthenticated, you get a 302 redirect to the OpenID login page, /_ah/login_required.I dunno what the right solution is here. Seems like it would require an API update. Maybe Nick or one of the other Googlers can weigh in.
For now, here’s a hacky workaround:
The next time you try to use remote_api, it should work without prompting for credentials. You’ll have to repeat the last 4 steps every time the cookie expires, though. You can bump the expiration from 1 day to as high as 2 weeks in the admin console to minimize the annoyance. Have fun!