Question

I'm trying to exchange an authorization code with an access token, following to the Google Oauth Documentation. Code below simply gives me an Error: HTTP 400: Bad Request, with nothing in the body.

Can anyone see what's wrong with this code?

#!/usr/bin/python
# -*- coding: utf-8 -*-
import gdata    
from gdata.youtube import YouTubeVideoEntry
from gdata.youtube.service import YouTubeService
from gdata.service import BadAuthentication, CaptchaRequired

import urllib2
import urllib   
import cjson
import urllib
import urlparse
import os, sys, random, string, argparse

from tornado import httpclient
import tornado.ioloop
import tornado.web

YT_CLIENT_ID = "redacted.apps.googleusercontent.com"
YT_CLIENT_SECRET = 'prettyrandom'


class ytOauthHandler(tornado.web.RequestHandler):
    def get(self):
        http_client = httpclient.AsyncHTTPClient()
        code = self.request.arguments['code'][0]
        post_data = {   'code'          : code, 
                        'client_id'     : YT_CLIENT_ID, 
                        'client_secret' : YT_CLIENT_SECRET, 
                        'redirect_uri'  : 'http://my.doma.in:8004/oauth_callback/', 
                        'grant_type'    : 'authorization_code'}         

        body = urllib.urlencode(post_data)                          
        url = "https://accounts.google.com/o/oauth2/token"
        http_client.fetch(url, self.handle_request, method='POST', headers={'Content-Type' : 'application/x-www-form-urlencoded'}, body=body) #Send it off!
        self.write('OK')

    def handle_request(self, response):
        print response


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        pass


application = tornado.web.Application([
    (r"/oauth_callback/", ytOauthHandler),
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8004)
    tornado.ioloop.IOLoop.instance().start()
Was it helpful?

Solution

Actually, never mind. Got the beautiful 200 OK now.

TROUBLESHOOTING TIPS:

  1. Check and double-check all credentials (client_id, client_secret, etc.)
  2. Check again, even though you know you don't need to. ;)

In other words, the above is working code!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top