3

环境 - Python 2.7.3,webpy。

我正在尝试使用 Python web.py 对 github 进行简单的 oauth 3 方式身份验证。根据 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 应用程序中配置。我已经仔细检查以确保这是正确的。

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

相反,我在浏览器中看到 http://<hostname>:8080/session 了 404 消息,因为我没有配置会话 URL。那是第 1 个问题。第 2 个问题 - 如果我配置会话 URL 并打印出帖子消息

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

我可以看到一些带有“authenticity_token”的数据发布到 URL。

我尝试使用 python_oauth2 库,但无法通过 authentication_url 调用。所以我尝试了这个更简单的请求库。有人可以向我指出这里出了什么问题。

4

2 回答 2

3

所以这就是我解决这个问题的方法。感谢 @Ivanzuzak 提供 requestb.in 提示。

我正在使用 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()

我之前没有使用 html 文件,而是直接从 githublogin 类发送请求。那没有用。在这里,我使用 html 来引导用户首先从他将登录到 gh 的位置。有了这个,我添加了一个 html 并使用模板渲染它。

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>

该文件直接取自开发指南,仅更改了 client_id 参数。

另一点需要注意的是,在 requests.post 方法中 - 直接传递 pay_load 是行不通的。它必须使用 json.dumps 进行序列化。

于 2013-03-25T16:18:57.800 回答
2

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

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

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

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

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

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

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

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

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

  5. 转到您创建的请求 bin 页面并刷新它。您现在将看到 GitHub OAuth 服务器向您发送的 HTTP GET 请求的日志条目,以及所有 HTTP 标头。基本上,您将看到与您被重定向到的 URL 中相同的代码参数。如果您获得此参数,您现在可以使用此代码和您的客户端密码发出 POST 请求,如您正在使用的指南的第 2 步所述:http: //developer.github.com/v3/oauth/#网络应用程序流

让我知道这些步骤是否对您造成了问题。

于 2013-03-25T10:52:48.403 回答