web-dev-qa-db-ja.com

OAuth localhostおよびpythonanywhere

私は、ユーザーがGoogleカレンダーへのアクセスを許可できるカレンダーアプリを作成しています。私のアプリでは、自分のカスタムスタイルで表示されたカレンダーを表示および編集できます。

これは、このGoogle "quickstart"サンプル に基づいています。

現在はローカルで正常に動作しますが、pythonanywhere.com(URLは http://myname.pythonanywhere.com )でホストされている場合、実行に失敗しました。

私が使用しているローカルバージョンでは、使用しているcredentials.jsonファイルは_"installed":_で始まり、AFAICTは「デスクトップアプリ」に対応し、_"redirect_uris":_には_["urn:ietf:wg:oauth:2.0:oob", "http://localhost”]_が含まれています。 ( " http:// localhost "は理にかなっていますが、2番目のURI "urn:ietf:wg:oauth:2.0:oob"がある理由はわかりません)

_{
    "installed": {
        "client_id": "XXXXXXXXXXXXXXXX.apps.googleusercontent.com",
        "project_id": "my_great_calendar",
        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        "token_uri": "https://oauth2.googleapis.com/token",
        "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
        "client_secret": "XXXXXXXXXXXXX",
        "redirect_uris": [
            "urn:ietf:wg:oauth:2.0:oob",
            "http://localhost"
        ]
    }
}
_

私が間違っている場合は修正してください。ただし、このcredentials.jsonファイルはmyname.pythonanywhere.comでホストされていると機能しない可能性があるため、新しい(Googleの「APIとサービス」ページで)ファイルを作成する必要があります。プロジェクトを「Webアプリケーション」として宣言することによって?そしてGoogleに私のリダイレクトURIを " http://myname.pythonanywhere.com "と伝えますか?

ローカルとpythonanywhereの両方で機能する単一のcredentials.jsonファイルを作成する方法があったら、

EDIT:クイックスタートサンプルは_InstalledAppFlow.from_client_secrets_file_を使用していますが、これは今では間違っていると思います。 here のように、代わりにgoogle_auth_oauthlib.flow.Flow.from_client_secrets_file()を使用する必要があるかもしれません。

4
Mick

複数のリダイレクトURIをサポートする単一のクライアントID /クライアントシークレットのペアを使用できます。

  • APIとサービスに移動
  • 資格情報に移動
  • クライアントIDを見つける
  • [編集](鉛筆アイコン)をクリックします
  • [承認済みリダイレクトURI]で、さらに追加できます。
  • 保存する

JSONには、2つのリダイレクトURIが含まれます。ライブラリがどのライブラリを使用するかを選択する方法がわからないので、redirect_uriパラメータを渡して明示的に指定することをお勧めします。

flow = Flow.from_client_secrets_file('client_secrets.json', redirect_uri='http://blah.pythonanywhere.com/')

どちらを使用するかを知るには、サーバーの起動時にいくつかの構成(環境変数やコマンドラインフラグなど)を渡すか、サーバーに自動的にホストヘッダーを見て検出させることができます。

1
Dirbaio