Как Вы получаете доступ к аутентифицируемому сервису Google App Engine от (невеб-) клиента Python?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

52
задан Charles 19 July 2012 в 17:49
поделиться

4 ответа

appcfg.py, инструмент, который загружает данные на Механизм Приложения, должен сделать точно это для аутентификации себя с сервером Механизма Приложения. Соответствующая функциональность абстрагирована в appengine_rpc.py. Короче говоря решение:

  1. Использование Google ClientLogin API для получения аутентификационного маркера. appengine_rpc.py делает это в , _GetAuthToken
  2. Отправляет подлинный маркер в специальный URL на Вашем приложении для Механизма Приложения. Та страница тогда возвращает cookie и 302 перенаправления. Проигнорируйте перенаправление и сохраните cookie. appcfg.py делает это в Использование _GetAuthCookie
  3. возвращенный cookie во всех будущих запросах.

можно также хотеть посмотреть _Authenticate, видеть, как appcfg обрабатывает различные коды возврата от ClientLogin, и _GetOpener, чтобы видеть, как appcfg создает urllib2 OpenerDirector, который не следует за перенаправлениями HTTP. Или Вы могли, на самом деле, просто использовать оптовую торговлю классами AbstractRpcServer и HttpRpcServer, так как они делают в значительной степени все, в чем Вы нуждаетесь.

39
ответ дан Nick Johnson 7 November 2019 в 09:29
поделиться

благодаря Паукообразному насекомому для ответа - это работало, как предложено

, вот упрощенная копия кода, в случае, если полезно следующему человеку, который попробует!

import os
import urllib
import urllib2
import cookielib

users_email_address = "billy.bob@gmail.com"
users_password      = "billybobspassword"

target_authenticated_google_app_engine_uri = 'http://mylovelyapp.appspot.com/mylovelypage'
my_app_name = "yay-1.0"



# we use a cookie to authenticate with Google App Engine
#  by registering a cookie handler here, this will automatically store the 
#  cookie returned when we use urllib2 to open http://currentcost.appspot.com/_ah/login
cookiejar = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
urllib2.install_opener(opener)

#
# get an AuthToken from Google accounts
#
auth_uri = 'https://www.google.com/accounts/ClientLogin'
authreq_data = urllib.urlencode({ "Email":   users_email_address,
                                  "Passwd":  users_password,
                                  "service": "ah",
                                  "source":  my_app_name,
                                  "accountType": "HOSTED_OR_GOOGLE" })
auth_req = urllib2.Request(auth_uri, data=authreq_data)
auth_resp = urllib2.urlopen(auth_req)
auth_resp_body = auth_resp.read()
# auth response includes several fields - we're interested in 
#  the bit after Auth= 
auth_resp_dict = dict(x.split("=")
                      for x in auth_resp_body.split("\n") if x)
authtoken = auth_resp_dict["Auth"]

#
# get a cookie
# 
#  the call to request a cookie will also automatically redirect us to the page
#   that we want to go to
#  the cookie jar will automatically provide the cookie when we reach the 
#   redirected location

# this is where I actually want to go to
serv_uri = target_authenticated_google_app_engine_uri

serv_args = {}
serv_args['continue'] = serv_uri
serv_args['auth']     = authtoken

full_serv_uri = "http://mylovelyapp.appspot.com/_ah/login?%s" % (urllib.urlencode(serv_args))

serv_req = urllib2.Request(full_serv_uri)
serv_resp = urllib2.urlopen(serv_req)
serv_resp_body = serv_resp.read()

# serv_resp_body should contain the contents of the 
#  target_authenticated_google_app_engine_uri page - as we will have been 
#  redirected to that page automatically 
#
# to prove this, I'm just gonna print it out
print serv_resp_body
34
ответ дан dalelane 7 November 2019 в 09:29
поделиться

Im, не слишком знакомый с AppEngine, или, Гуглит веб-пчелу, но для метода решения "в лоб" Вы могли записать, что сценарию с чем-то нравится, механизируют ( http://wwwsearch.sourceforge.net/mechanize/ ) для простого обхода посредством процесса входа в систему, прежде чем Вы начнете делать реальную работу клиента.

0
ответ дан Sean O Donnell 7 November 2019 в 09:29
поделиться

Я не эксперт по Python или эксперт по механизму приложения. Но Вы пробовали после образца, прикладного в http://code.google.com/appengine/docs/gettingstarted/usingusers.html . Я создал один в http://quizengine.appspot.com , это, казалось, хорошо работало с аутентификацией Google и всем. Просто предложение, но заглядывают к руководству по началу работы. Успокойтесь, если предложение звучит наивным.:) Спасибо.

-1
ответ дан 7 November 2019 в 09:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: