2

シンプルなアプリを使って Todist リストに Todo を投稿する機能を追加しています。現時点では"error"=>"invalid_grant"、コードを access_token に交換すると応答が返ってきます。

このコンテキストでも「invalid_grant」が何を参照しているのか正確にはわかりません。私が見つけた他の答えは、さまざまな Google API に関するものです。Todoist APIのドキュメントには、それについての言及はありません。

トークン交換のポスト リクエストは次のとおりです。

uri = URI('https://todoist.com/oauth/access_token')
result = Net::HTTP.post_form(uri, client_id: ENV['TODOIST_CLIENT_ID'], client_secret: ENV['TODOIST_CLIENT_SECRET'], code: params[:code])
json_body = JSON.parse(result.body) # <- prints error

これを理解して解決するための助けは大歓迎です。

アップデート

Takahiko Kawasaki の回答を読んだ後、リクエストを次のように更新しましたが、同じエラー メッセージが表示されます。

uri = URI('https://todoist.com/oauth/access_token')
data = {
  :client_id => ENV['TODOIST_CLIENT_ID'],
  :client_secret => ENV['TODOIST_CLIENT_SECRET'],
  :code => params[:code],
  :grant_type => 'authorization_code',
}
result = Net::HTTP.post_form(uri, data)
json_body = JSON.parse(result.body)
4

2 に答える 2

1

以下を追加します。

grant_type: 'authorization_code'

RFC 6749、4.1.3 を参照してください。詳細については、アクセス トークン リクエストを参照してください。


改訂された質問に対する追加のコメント。

Todoist による OAuth の実装は成熟していないようです。彼らのAPI ドキュメントを調べたところ、すぐにRFC 6749に対する違反がいくつか見つかりました。

たとえば、(1) スコープはスペースで区切る必要がありますが、ドキュメントにはコンマを使用する必要があると記載されています。grant_type(2) それらのトークン エンドポイントは、仕様で要求されている要求パラメーターを必要としません。(3) トークン エンドポイントからの応答のパラメーターの値は、提示された承認コードが間違っている場合であるerrorはずですが、API ドキュメントでは値が になると記載されていますが、これは正式な値ではありません。invalid_grantbad_authorization_code

さらに、これは違反ではありませんが、アクセス トークンを取り消すための API の仕様は、アクセス トークンの取り消しに関する公式仕様であるRFC 7009の存在を知らないことを意味します。

スマートフォン アプリケーションなどのパブリック クライアント (RFC 6749, 2.1. Client Typesclient_secret ) の場合、トークン エンドポイントのリクエスト パラメータはオプションである必要がありますが、API ドキュメントには必須であると記載されています。

彼らの OAuth 実装は仕様に準拠していないため、Todoist に直接問い合わせた方がよいでしょう。

于 2016-05-11T12:25:17.430 に答える