通过python oauth2库重定向issu访问Github api v3

2024-04-30 01:36:36 发布

您现在位置:Python中文网/ 问答频道 /正文

环境—Python2.7.3,webpy。在

我正在尝试使用Python对github进行简单的oauth 3路身份验证网页.py. 根据github上的基本oauth指南,我正在做如下操作:

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

这是把我送到GH登录页面。一旦我登录-GH不会将我重定向到回叫。redirect_uri参数在github应用程序中配置。我已经仔细检查过了,以确保这是正确的。在

^{pr2}$

在浏览器里我看到了 http://<hostname>:8080/session 还有一条404消息,因为我还没有配置会话URL。这是第一个问题。问题2-如果我配置会话URL并打印出post消息

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

我可以看到一些数据发布到URL上,带有一个名为“authenticity_token”的东西。在

我尝试过使用python_oauth2库,但无法通过authorization\u url调用。所以我尝试了这个更简单的请求库。有人能告诉我这里出了什么问题吗。在


Tags: importselfgithubclientwebjsonurldata
2条回答

我不确定您的问题是什么,但是请尝试复制下面的流程,首先手动使用浏览器,然后使用python库。它将帮助您调试该问题。在

  1. http://requestb.in/上创建请求bin。请求bin基本上是一个记录所有发送到它的HTTP请求的服务。您将使用它而不是回调来记录发送到回调的内容。复制请求bin的URL,类似于http://requestb.in/123a546b

  2. 转到GitHub(https://github.com/settings/applications)上的OAuth应用程序设置,输入特定应用程序的设置,并将回调URL设置为刚刚创建的请求bin的URL。

  3. 向GitHub OAuth页面发出请求,并定义客户机_id。只需在浏览器中输入以下URL,但将此处的“客户端”ID更改为OAuth应用程序的客户端ID:

    https://github.com/login/oauth/authorize?client_id=YOUR_CLIENT_ID_HERE

  4. 输入用户名和密码,然后单击“授权”。然后,GitHub应用程序将重定向到您创建的request bin服务,浏览器中的URL应该类似于(注意code query参数):

    http://requestb.in/YOUR_REQUEST_BIN_ID?code=GITHUB_CODE

    (例如,http://requestb.in/abc1def2?code=123a456b789cdef

    另外,浏览器中页面的内容应该是“ok”(这是请求bin服务返回的内容)。

  5. 转到您创建的请求bin页面并刷新它。现在您将看到githuboauth服务器向您发送的httpget请求的日志条目,以及所有HTTP头。基本上,您将看到与重定向到的URL中相同的code参数。如果您得到了这个参数,您现在就可以使用这个代码和您的客户机密码发出POST请求了,如您正在使用的指南的第2步所述:http://developer.github.com/v3/oauth/#web-application-flow

如果这些步骤中有任何一个给你带来麻烦,请告诉我。在

我是怎么解决这个问题的。感谢@Ivanzuzak请求B.in小费。在

我用的是pythonwebpy。在

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()

我以前没有使用html文件,而是直接从githublogin类发送请求。那没用。这里我使用一个html来引导用户首先从哪里登录到gh。在此基础上,我添加了一个html并使用templator呈现它。在

^{pr2}$

这个文件直接取自dev guide,只改变了client_id参数。在

另一点需要注意的是请求.post方法-直接传递pay_负载不起作用。必须使用json.dumps文件. 在

相关问题 更多 >