Google App Engine Python - YouTube API v3 - Insufficient Permission

717 views Asked by At

I successfully duplicated the Tasks API from this video, but I am unable to successfully translate this format to using the YouTube API.

Here is my .py file:

import httplib2
import os
import sys
import jinja2
import webapp2
import logging
import pprint

from oauth2client import tools
from oauth2client.client import flow_from_clientsecrets
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.client import AccessTokenRefreshError
from oauth2client.tools import argparser, run_flow
from oauth2client.appengine import OAuth2Decorator

from apiclient.discovery import build
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template

decorator = OAuth2Decorator(
    client_id = '*my client ID*',
    client_secret = '*my client secret*',
    scope='https://www.googleapis.com/auth/youtube')

service = build("youtube", "v3")

class MainHandler(webapp2.RequestHandler):
    @decorator.oauth_required
    def get (self):
        self.response.headers['Content-Type'] = 'text/plain'

        channels_list = service.channels().list(
            mine=True,
            part="id"
        ).execute(http = decorator.http())
        self.response.out.write (pprint.pformat(channels_list))


app = webapp2.WSGIApplication (
        [
            ('/', MainHandler),
            (decorator.callback_path, decorator.callback_handler()),
        ], 
        debug=True)

Here is my Traceback:

Traceback (most recent call last):

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1535, in __call__

    rv = self.handle_exception(request, response, e)

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1529, in __call__

    rv = self.router.dispatch(request, response)

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1278, in default_dispatcher

    return route.handler_adapter(request, response)

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1102, in __call__

    return handler.dispatch()

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 572, in dispatch

    return self.handle_exception(e, self.app.debug)

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 570, in dispatch

    return method(*args, **kwargs)

  File "C:\Users\...\testapp\oauth2client\appengine.py", line 733, in check_oauth

    resp = method(request_handler, *args, **kwargs)

  File "C:\Users\...\testapp\testapp.py", line 35, in get

    ).execute(http = decorator.http())

  File "C:\Users\...\testapp\oauth2client\util.py", line 129, in positional_wrapper

    return wrapped(*args, **kwargs)

  File "C:\Users\...\testapp\apiclient\http.py", line 723, in execute

    raise HttpError(resp, content, uri=self.uri)

HttpError: <HttpError 403 when requesting https://www.googleapis.com/youtube/v3/channels?part=id&mine=true&alt=json returned "Insufficient Permission">

INFO     2015-06-13 12:27:54,515 module.py:788] default: "GET / HTTP/1.1" 500 2278

I have checked and double-checked that I have both the YouTube Data API and YouTube Analytics API enabled this client ID. I have even disabled them and re-enabled to check, but I am still getting this error.

I am new to GAE and its methods, so maybe I am not understanding an error in the Traceback.

One note is that I was getting "ImportError: No module named..." for apiclient, httplib2, oauth2client, and uritemplate, so I moved those folders directly into my app file (and didn't get that error again). Not sure if moving those directly into the folder is causing errors.

1

There are 1 answers

1
sean On

Well I hope I didn't waste anyone's time, but if anyone else has this issue, I found this question, and although I didn't have a memcache issue, I revoked permission for my app from the user account I was using, refreshed the app and gave permission again and now it seems to be working.

I guess this was a Google-side issue. Thanks to anyone who spent the time to read my question.