Базовая настройка аутентификации Oauth2 API Google не в состоянии дать объекты? - PullRequest
0 голосов
/ 25 мая 2018

Я закодировал аутентификацию и получаю токен доступа, но когда я использую его для захвата объекта, я просто получаю 'NoneType' object is not callable.

 Exception Location: googleads\adwords.py in GetService, line 365
 Exception Type: Type Error
 Exception Value: Internal Server Error: /oauth2callback

Я получаю одинаковый результат при вызовеКлиент или CampaignService.Я не понимаю, что я делаю неправильно.

Я слежу за кодом в Googleads .

def getAdwordsFlow():
    FLOW.redirect_uri = 'http://localhost/oauth2callback'

    # Generate URL for request to Google's OAuth 2.0 server.
    authorization_url, state = FLOW.authorization_url(
        access_type='offline',
        include_granted_scopes='true')
    return authorization_url


def getAdwordsTokens(request):
    auth_code = request.GET.get('code')
    FLOW.fetch_token(code=auth_code)
    credentials = FLOW.credentials

    oauth2_client = oauth2.GoogleAccessTokenClient(
    FLOW.credentials.token, FLOW.credentials.expiry)

    adwords_client = adwords.AdWordsClient(
    "DEVELOPER-TOKEN", oauth2_client, "USER-AGENT", "CLIENT-CUSTOMER-ID")

    customer = adwords_client.GetService('CustomerService').getCustomers()[0]
    print('You are logged in as customer: %s' % customer['customerId'])

    return HttpResponseRedirect("/")

url.py

urlpatterns = [
    re_path(r'^oauth2callback', queries.getAdwordsTokens, name='auth_calledback'),] #How 

view.py

def index(request):
    return redirect(getAdwordsFlow())

Выход терминала:

"GET /oauth2callback?state=XXXXXXXXX&code=4/XXXXXXXXXXX&scope=https://www.googleapis.com/auth/adwords+https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email HTTP/1.1" 500 80213 Почему это 500?

Я заметил, что мой токен доступа имеет другое значение, когда я вызываюЭто.Итак, я предполагаю, что это работает.

1 Ответ

0 голосов
/ 25 мая 2018

В соответствии с вашим вопросом, ваш сервисный звонок -

GET / oauth2callback? State = XXXXXXXXX & code = 4 / XXXXXXXXXXX & scope = https://www.googleapis.com/auth/adwords+https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email HTTP / 1.1

Этот вызов не является ни вызовом токена доступа, ни access_token в запросе, и согласно вашему справочному коду он сгенерирует access_token из refresh_token.

def main(access_token, token_expiry, client_customer_id, developer_token,
         user_agent):
  oauth2_client = oauth2.GoogleAccessTokenClient(access_token, token_expiry)

  adwords_client = adwords.AdWordsClient(
      developer_token, oauth2_client, user_agent,
      client_customer_id=client_customer_id)

  customer = adwords_client.GetService('CustomerService').getCustomers()[0]
  print 'You are logged in as customer: %s' % customer['customerId']


if __name__ == '__main__':
  args = parser.parse_args()

  # Retrieve a new access token for use in this example. In a production
  # application, you may use a credential store to share access tokens for a
  # given user across applications.
  oauth2credentials = client.OAuth2Credentials(
      None, args.client_id, args.client_secret, args.refresh_token,
      datetime.datetime(1980, 1, 1, 12), GOOGLE_OAUTH2_ENDPOINT,
      USER_AGENT)

  oauth2credentials.refresh(httplib2.Http())

  main(oauth2credentials.access_token, oauth2credentials.token_expiry,
       args.client_customer_id, args.developer_token, USER_AGENT)

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

...