0

更新日:解決済み。私は本当に何かの間で基本的な間違いをしていました。 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のコンテンツを除く)。

これは私がどこかで非常に基本的なエラーを作っていると信じていますが、私はそれを見つけることに成功していません。私はここで間違って何をしていますか?参考資料へのリンクは非常に高く評価されます。あなたの時間と注意に感謝します。

答えて

0

"grant_type": "authorization_code"を試してください。そして、付与タイプをヘッダーとして追加します。

また、このリンクをチェック - Accessing Google oAuth giving invalid grant_type (Bad request)

+0

私はこれを試してみたが、成功しません。私はまだ同じエラーメッセージを受け取ります。 – ModelHX

+0

grant_typeをペイロードではなくヘッダーの一部として追加しましたか? – Sayali

+0

ペイロードとヘッダーに 'grant_type'を付けて送信すると(' authorisation_code'に変更すると、上記と同じエラーメッセージが表示されます)、ヘッダーのみに 'grant_type'を付けてポストするとエラーメッセージ' {'error_uri': ''、 'error_description': '必須パラメータがありません:grant_type'、 'error': 'invalid_request'} ' – ModelHX

関連する問題