Chromeの拡張からTwitterを使いたかったのですが、認証・認可に使ってたライブラリが結局全部使えなくなったので、chrome.identity.launchWebAuthFlowで実装することにしました。
ソースコードが長いのと、使い回しができるのでGitHubにコミットしておきました。 options.js が本体です。
retrorocket/chrome-extension-twitter-oauth-sample: TwitterのOAuth1.0認証認可をChrome拡張から実施するサンプル
シグネチャをつくる部分はさすがにライブラリがあるので、安心と信頼の johan/oauth-js: A mirror of the svn http://oauth.googlecode.com/svn/code/javascript/ (sub-)repository. を使用しています。差し替えできる処理なので、好きなライブラリを使っても問題ないです。
chrome.identity.launchWebAuthFlowは非同期なので、呼び出し処理をpromiseとして定義しておかないとrequest tokenの取得が終わる前に勝手に呼び出されて認可に失敗します。ここはほんとに原因がわからなくて詰みかけました。
launchWebAuthFlow、仕様的にもOAuth 2.0向けのAPIなのに無理やりつかうのも微妙なので、Twitterは早くApplication-only authentication以外をOAuth 2.0に対応させてほしいです。
久々にOAuth周りのドキュメントとか仕様とかを読んだのですが、めちゃくちゃ忘れてるところが多かったので実装してよかったと思いました。
あと、Chromeの拡張にConsumer keyとsecret埋めこんだ場合、アプリのソースを覗かれるとkeyとsecretがバレますが、Callback URLの仕様が変わってホワイトリスト形式になり、詐称も難しくなったので、特に問題ないと思っています。