I can see why Tony's version would work. His "algorithm" has two
steps:

1. Get the authorization token using ClientLogin (which I also managed
to do).
2. Use the uri "servername/_ah/login" to get the auth. cookie.

The appengine_rpc module seems to do authentication in a similar way:

A. Try to access the app. This results in a redirect to a location
that starts with https://www.google.com/accounts/ServiceLogin
B. Get a auth. token (like step 1 above)
C. Use auth. token to get auth. cookie.
D. Try to access the app. again (this is where it fails in my case...)

Anyway, step C is performed using the function below:

-------

def _GetAuthCookie(self, auth_token):
    """Fetches authentication cookies for an authentication token.

    Args:
      auth_token: The authentication token returned by ClientLogin.

    Raises:
      HTTPError: If there was an error fetching the authentication
cookies.
    """
    continue_location = "http://localhost/";
    args = {"continue": continue_location, "auth": auth_token}
    login_path = os.environ.get("APPCFG_LOGIN_PATH", "/_ah")
    req = self._CreateRequest("%s://%s%s/login?%s" %
                              (self.scheme, self.host, login_path,
                               urllib.urlencode(args)))
    try:
      response = self.opener.open(req)
    except urllib2.HTTPError, e:
      response = e
    if (response.code != 302 or
        response.info()["location"] != continue_location):
      raise urllib2.HTTPError(req.get_full_url(), response.code,
response.msg,
                              response.headers, response.fp)
    self.authenticated = True

------

It seems to me, that we do nothing with the response in this
function?? Shouldn't we save the cookie in the response like Tony's
does above, and then use it when we try to log in again?

On Jul 15, 1:06 pm, epb <esbenbu...@gmail.com> wrote:
> Thanks for your answers.
>
> As I understand Nick's response, I only need to use appengine_rpc.py
> for the entire process. I tried the following:
>
> -------
>
> def passwdFunc():
>     return ('my_email','my_passwd')
>
> rpcServer = appengine_rpc.HttpRpcServer
> ('myapp.appspot.com',passwdFunc,None,'myAppName')
> blah = rpcServer.Send('/')
>
> -------
>
> This gave me a 302 error and the following log:
>
> -------
>
> Server: myapp.appspot.com
> Sending HTTP request:
> POST /? HTTP/1.1
> Host: myapp.appspot.com
> X-appcfg-api-version: 1
> Content-type: application/octet-stream
>
> Got http error, this is try #1
> Got 302 redirect. 
> Location:https://www.google.com/accounts/ServiceLogin?service=ah&continue=http...
> nue%3Dhttp://myapp.appspot.com/
> &ltmpl=gm&ahname=MyAppName&sig=46378246....321321312
> Sending HTTP request:
> POST /? HTTP/1.1
> Host: myapp.appspot.com
> X-appcfg-api-version: 1
> Content-type: application/octet-stream
>
> Got http error, this is try #2
>
> -------
>
> It seems to me that the Send() function should do all authentication-
> work automatically and re-direct to the app page after logging in.
> Right?
>
> Anyway, I'll try out Tonys solution also..
>
> On Jul 15, 11:18 am, Tony <fatd...@gmail.com> wrote:
>
> > Since I happened to have this up, here's a bit of sample code to get
> > an authentication cookie for an appspot app...
>
> > from google.appengine.api import urlfetch
> > from urllib import urlencode
> > email = request.POST['username']
> > passwd = request.POST['password']
> > serv_root = "http://myapp.appspot.com";
> > target = 'http://myapp.appspot.com/null'
> > app_name = "myapp-1.0"
> > auth_uri = 'https://www.google.com/accounts/ClientLogin'
> > authreq_data = urlencode({ "Email":   email,
> >                                   "Passwd":  passwd,
> >                                   "service": "ah",
> >                                   "source":  app_name,
> >                                   "accountType": "HOSTED_OR_GOOGLE" })
> > result = urlfetch.fetch(auth_uri, authreq_data, method=urlfetch.POST,
> > follow_redirects=False)
> > auth_dict = dict(x.split("=") for x in result.content.split("\n") if
> > x)
> > auth_token = auth_dict["Auth"]
> > serv_args = {}
> > serv_args['continue'] = target
> > serv_args['auth']     = auth_token
> > serv_uri = "%s/_ah/login?%s" % (serv_root, urlencode(serv_args))
> > result2 = urlfetch.fetch(serv_uri, follow_redirects=False,
> > method=urlfetch.GET)
> > ### here's the cookie which will authenticate future requests
> > cookie = result2.headers['set-cookie'].split(';')[0]
> > # cookie[0] => "ACSID"
> > # cookie[1] => "AAAAHFSDJHSDFHSDJFHSDJFHSJFSDfsdjfhsjdfhsjdfh..."
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to