Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Github api v3 access via python oauth2 library - Redirect issue

Environment - Python 2.7.3, webpy.

I'm trying a simple oauth 3 way authentication for github using Python web.py. Per the basic oauth guide on github I'm doing something like this:

import web,requests
import oauth2,pymongo,json
from oauth2client.client import OAuth2WebServerFlow
urls=('/', 'githublogin',
      '/session','session',
      '/githubcallback','githubCallback');
class githublogin:
  def GET(self):
    new_url = 'https://github.com/login/oauth/authorize'
    pay_load = {'client_id': '',
                'client_secret':'',
                'scope':'gist'
               }
    headers = {'content-type': 'application/json'}
    r = requests.get(new_url, params=pay_load, headers=headers)
    return r.content

This is sending me to the GH login page. Once I sign in - GH is not redirecting me to the callback. The redirect_uri parameter is configured in the github application. I've double checked to make sure that's correct.

 class githubCallback:
   def POST(self):
     data =  web.data()
     print data
   def GET(self):
     print "callback called"

Instead in the browser I see http://<hostname>:8080/session and a 404 message, because I haven't configured the session URL. That's problem no 1. Problem no 2 - If I configure the session URL and print out the post message

class session:
  def POST(self):
    data =  web.data()
      print data
    def GET(self):
      print "callback called"

I can see some data posted to the URL with something called 'authenticity_token'.

I've tried to use the python_oauth2 library but can't get past the authorization_url call. So I've tried this much simpler requests library. Can someone please point out to me whats going wrong here.

like image 568
Pradeep Banavara Avatar asked Jun 10 '26 21:06

Pradeep Banavara


1 Answers

So here's how I solved this. Thanks to @Ivanzuzak for the requestb.in tip.

I'm using Python webpy.

import web,requests
import oauth2,json
urls=('/', 'githublogin',
      '/githubcallback','githubCallback');
render = web.template.render('templates/')
class githublogin:
  def GET(self):
    client_id = ''
    url_string = "https://github.com/login/oauth/authorize?client_id=" + client_id
    return render.index(url_string)

class githubCallback:
  def GET(self):
    data =  json.loads(json.dumps(web.input()))
    print data['code']
    headers = {'content-type': 'application/json'}
    pay_load = {'client_id': '',
                'client_secret':'',
                'code' : data['code'] }
    r = requests.post('https://github.com/login/oauth/access_token',  data=json.dumps(pay_load), headers=headers)
    token_temp = r.text.split('&')
    token = token_temp[0].split('=')
    access_token = token[1]
    repo_url = 'https://api.github.com/user?access_token=' + access_token
    response = requests.get(repo_url)
    final_data = response.content
    print final_data

app = web.application(urls,globals())
if __name__ == "__main__":
  app.run()

I was not using a html file before, but sending the request directly from the githublogin class. That didn't work. Here I'm using a html to direct the user first from where he'll login to gh. With this I added a html and rendered it using the templator.

def with (parameter)
<html>
  <head>
  </head>
  <body>
    <p>Well, hello there!</p>
    <p>We're going to now talk to the GitHub API. Ready? <a href=$parameter>Click here</a> to begin!</a></p>
    <p>If that link doesn't work, remember to provide your own <a href="http://developer.github.com/v3/oauth/#web-application-flow">Client ID</a>!</p>
  </body>
</html>

This file is taken straight from the dev guide, with just the client_id parameter changed.

Another point to be noted is that in the requests.post method - passing the pay_load directly doesn't work. It has to be serialized using json.dumps.

like image 165
Pradeep Banavara Avatar answered Jun 12 '26 10:06

Pradeep Banavara



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!