更新日:解決済み。私は本当に何かの間で基本的な間違いをしていました。 session.headers.update
関数の使用方法が正しくありませんでした。 session.headers.update = {foo:bar}
の代わりに、私はsession.headers.update({foo:bar})
をやる必要がありました。今意図したとおりに動作しますGoogleサービスアカウントのアクセストークンリクエスト:「必須パラメータがありません:grant_type」
payload = "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=" + token.decode("utf-8")
コード:これに
payload = urllib.parse.urlencode({
"grant_type":"urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion": str(token)
})
:このことから
:さらに、私は、コードの次のセクションを変更しました。
以下
オリジナルの質問は、私はこの問題についてSOおよびGoogleでいくつかのヒットを見てきました。私は確かに自分のコードを再確認して、私が彼らが細部と同じ問題を犯していないことを確かめました。人々が抱えている問題は、POSTデータをパラメータとして渡すか、間違ったURLにPOSTすることです。さらに、私が見つけたヒットの大部分は、ユーザーを巻き込んだ3足歩行のOAuth2を含んでいます。私はサービス・アカウントとJWTに関連するヒット数が比較的少ないことがわかりました。ユーザー・フローとは十分に異なるため、自分の問題との関連性が懸念されています。
サービスアカウントのGoogle認証サーバーからアクセストークンを取得しようとしています。私は自分のJWTを生成して、今私のアクセストークンを受け取るためにサーバーにPOSTしたい。私は、「アクセストークン要求の作成」のhereと書かれている文書に従ってヘッダーを設定しましたが、私の要求は仕様通りですが、Googleは400応答で応答し、次のJSON :
{'error': 'invalid_request', 'error_description': 'Required parameter is missing: grant_type'}
ここで問題の原因となったコードです:
# Returns the session, now with the Host and Authorization headers set.
def gAuthenticate(session):
token = createJWT()
session.headers.update = {
"Host": "www.googleapis.com",
"Content-Type": "application/x-www-form-urlencoded"
}
payload = urllib.parse.urlencode({
"grant_type":"urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion": str(token)
})
response = session.post("https://www.googleapis.com/oauth2/v4/token", data = payload)
session.headers.update = {"Authorization": "Bearer " + response.json()["access_token"]}
return session
私はこのコードで奇妙な問題の多くを抱えています。まず最初に、urllib.parse.urlencode
辞書(つまり、単にpayload = {dictionary}
)を入力しなかった場合は、Bad Request/'invalid_request'
というエラーが表示されます。これは、あまり具体的でないエラーメッセージから、私が現在行っていることよりも受け入れにくいことを意味します。なぜ私はこれをしなければならないのですか?リクエストは私のために私のデータをエンコードしていないのですか?これまでにRequestsを使用してPOSTする際にこの問題は発生しませんでした。
第2に、送信される前に準備された要求を調べると、ヘッダーの更新にもかかわらず、自分のヘッダーが正しく設定されていないことがわかります。リクエストに追加したヘッダーのいずれも送信されていません。
私はリクエストの本文を調べましたが、ドキュメントでは例としてGoogleが提供しているものと同じに見えます(もちろんJWTのコンテンツを除く)。
これは私がどこかで非常に基本的なエラーを作っていると信じていますが、私はそれを見つけることに成功していません。私はここで間違って何をしていますか?参考資料へのリンクは非常に高く評価されます。あなたの時間と注意に感謝します。
私はこれを試してみたが、成功しません。私はまだ同じエラーメッセージを受け取ります。 – ModelHX
grant_typeをペイロードではなくヘッダーの一部として追加しましたか? – Sayali
ペイロードとヘッダーに 'grant_type'を付けて送信すると(' authorisation_code'に変更すると、上記と同じエラーメッセージが表示されます)、ヘッダーのみに 'grant_type'を付けてポストするとエラーメッセージ' {'error_uri': ''、 'error_description': '必須パラメータがありません:grant_type'、 'error': 'invalid_request'} ' – ModelHX