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()
Actually, never mind. Got the beautiful 200 OK now.
TROUBLESHOOTING TIPS:
In other words, the above is working code!