3

環境-Python2.7.3、webpy。

Pythonweb.pyを使用してgithubの単純なoauth3ウェイ認証を試しています。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 、セッションURLを構成していないため、ブラウザーに404メッセージが表示されます。それは問題1ではありません。問題2-セッションURLを構成し、投稿メッセージを印刷した場合

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

'authenticity_token'という名前でURLに投稿されたデータを見ることができます。

python_oauth2ライブラリを使用しようとしましたが、authorization_url呼び出しを通過できません。だから私はこのはるかに単純なリクエストライブラリを試しました。誰かがここで何が悪いのか私に指摘してもらえますか?

4

2 に答える 2

3

これが私がこれを解決した方法です。requestb.inのヒントを提供してくれた@Ivanzuzakに感謝します。

私は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を追加し、テンプレートを使用してレンダリングしました。

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パラメーターのみを変更して、開発ガイドから直接取得したものです。

注意すべきもう1つのポイントは、requests.postメソッドでは、pay_loadを直接渡すことは機能しないということです。json.dumpsを使用してシリアル化する必要があります。

于 2013-03-25T16:18:57.800 に答える
2

問題があなたの側にあるかどうかはわかりませんが、最初にブラウザを使用して手動で、次にPythonライブラリを使用して、このフローを以下に再現してみてください。問題をデバッグするのに役立ちます。

  1. http://requestb.in/にリクエストビンを作成します。リクエストビンは基本的に、送信されたすべてのHTTPリクエストをログに記録するサービスです。コールバックの代わりにこれを使用して、コールバックに送信されているものをログに記録します。http://requestb.in/123a546bのようなリクエストビンのURLをコピーします

  2. GitHub(https://github.com/settings/applications)でOAuthアプリケーションの設定に移動し、特定のアプリケーションの設定を入力して、コールバックURLを作成したリクエストビンのURLに設定します。

  3. client_idを定義して、GitHubOAuthページにリクエストを送信します。以下のURLをブラウザに入力するだけですが、YOUR_CLIENT_ID_HEREをOAuthアプリケーションのクライアントIDに変更します。

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

  4. ユーザー名とパスワードを入力し、[承認]をクリックします。GitHubアプリは、作成したリクエストビンサービスにリダイレクトします。ブラウザーのURLは次のようになります(コードクエリパラメーターに注意してください)。

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

    (たとえば、http://requestb.in/abc1def2?code=123a456b789cdef

    また、ブラウザのページのコンテンツは「ok」である必要があります(これはリクエストビンサービスによって返されるコンテンツです)。

  5. 作成したリクエストビンページに移動し、更新します。これで、GitHubOAuthサーバーから送信されたHTTPGETリクエストのログエントリと、すべてのHTTPヘッダーが表示されます。基本的に、リダイレクト先のURLに存在するのと同じコードパラメータが表示されます。このパラメーターを取得すると、使用しているガイドのステップ2で説明されているように、このコードとクライアントシークレットを使用してPOSTリクエストを行う準備が整います。http://developer.github.com/v3/oauth/# web-application-flow

これらの手順のいずれかが問題を引き起こしている場合はお知らせください。

于 2013-03-25T10:52:48.403 に答える