usakdsteen

ゆうさくですてぃーん

おうおうす

普通の人ならば、テキトーにOAuth扱えるライブラリなり拾ってきて、ササっとやっちまう

ところがレナドーン君はアホなのでライブラリ探さず自前で実装するのであった…

 

 

前回は

ひとまずツイッターのAPI叩ければそれでいいと雑にやってたので理解も雑だった

neetsdkasu.hatenablog.com

 

今回は少し真面目にやったので、OAuthを少し理解できた

tools.ietf.org

 

 

ひとまず、トラブったとこだけメモっとく

 

 

1つ目

パーセントエンコードを勘違いしてた

これ、プログラミング言語の標準ライブラリにあるURLエンコードとかを使うと失敗する…(このRFCにもそれについて触れてるけど)

ASCII文字の英字(アルファベット)と数字はそのままでいいのは同じだが

それ以外の文字に関してエンコードの仕方が微妙に違うらしく

OAuth用に独自に実装するのがベターっぽい

ASCII文字の

ハイフン(マイナス記号?)、ドット(ピリオド?)、アンダースコア、チルダ

の4種類の文字はエンコードせずそのまま

それ以外の文字はパーセントエンコードするわけだが、そのときの16進数のアルファベットは大文字にする必要がある

 

(※違いを理解せずGoのurl.QueryEscape*1使ってしまいgo test*2でハマってた…)

 

 

2つ目

oauth_signatureの生成に使用する値セットについて勘違いしてた

メソッド名 & ベースURI & パラメータ繋げたもの

をハッシュ化するわけなんだけど

ベースURIをパスを含めずhttp://example.com/にすると勘違いしてた、、、(※これもgo testでハマってた一因…)(前回はベースURI正しくやってたのに今回はアホだった…)

正しくはベースURIはパスも含める必要がありhttp://example.com/api/foobar.jsonとする必要があった…

パラメータを繋げたものURLのクエリ部分とOAuthのパラメータの2種類だけと勘違いしてた…(前回のツイッターのやつではそれで十分らしくそれしか処理してなかった…) (これのせいではてなのOAuthで認証エラーでハマってた…)

正しくはPOSTメソッドでContent-Typeをapplication/x-www-form-urlencodedとして送信するときでbodyがシングルパートのとき、フォームのデータのキーと値も含めてoauth_signatureの生成に使用する必要がある…

 

 

 

 

前回やったときは

OAuthについて真面目に調べたりしてなかったから

抽象的な手法かなんかを各サービスが実装提供してんのかなと思ってた

OAuthのライブラリなんかも各サイトごとに合わせて作ってんのかな、とか思ってた

今回、少し真面目にやってみてOAuthはそれ自体が具体的な手法であり共通仕様なんだなってことを理解した…テキトーにOAuthのライブラリ拾ってくればOAuth対応のサービスをカンタンに利用できちゃうの…しゅごい…

(まぁOAuthを提供する側の実装はかなーり大変そうではあるが…)(提供側の話については一切読んでないが)(テキトー)

 

 

 

 

 

*1:url.PathEscapeも異なる結果になる…

*2:testに用いたのは前回のツイッターのやつのときに使ったテストデータ