雑なので間違ってるとこあるかもしれん
(Update: 2017-05-16 7:47 ... oauth_signatureの生成方法が完全に間違っていたのを修正)
https://dev.twitter.com/oauth/3-legged
3-leged OAuth
よく見かける認証(?)
1. ツイッターから認証許可用トークン(リクエストトークン)を貰う
2.ユーザに認証許可用トークンを含むURLへアクセスしてもらい許可してもらう
3.アクセストークンをゲット
(※受け取る認証許可用トークンもアクセストークンもパラメータ名はoauth_tokenと同じものになる(シークレットも同様))
1.認証許可用トークンの取得
https://dev.twitter.com/oauth/reference/post/oauth/request_token
のAPIを叩くと認証許可用トークンのoauth_tokenとoauth_token_secretを入手できる
request_tokenのAPIを叩くときにヘッダのAuthorizationに含める項目は
https://oauth.net/core/1.0/#auth_step1 あたりに大体説明が書いてある
oauth_nonce ... ランダムな英数字の文字列なら何でもいいらしいけど、推奨は32byteのランダムなデータをBASE64した文字列から英数字以外を削除したものがいいらしい
oauth_timestamp ... 1970/1/1からの秒数(所謂Unix時刻?) 現在時刻より少し大きめに取ればいいらしい
oauth_consumer_key
... TwitterのDeveloperページでアプリ申請時に貰うキーだと思う
oauth_signature_method
... シグネチャの暗号化方法の指定、HMAC-SHA1
を指定する
oauth_version
... 1.0を指定ね
oauth_callback
... ここで指定したURLにアクセストークンが送信される、Webサービスなら専用サーバーを用意して受け取るか、アプリなら簡易サーバー立ててlocalhostへのコールバックで受け取るか、(※URLでなくoobの文字列を指定するとPIN認証というものになる)
oauth_signature
... 上記の各種パラメータ名と値を"パラメータ名=値"とし&で連結した文字列を作りURLエンコードする(P)、"POST"と(URLエンコードしたAPIのURL)と(P)を&で連結した文字列をシグネチャ・ベースストリングとする、開発者としてのアプリ登録時のシークレットキーをURLエンコードしたものの末尾に&をつけた文字列をサイニング・キーとする、このベースストリングとキーを使いHMAC-SHA1
でハッシュ化したものをBASE64で文字列にしたものをシグネチャとする( https://dev.twitter.com/oauth/overview/creating-signatures )
デスクトップアプリケーションの場合(?)
2.ユーザに認証許可用トークンを含むURLへアクセスしてもらい許可してもらう
3.アクセストークンをゲット
https://dev.twitter.com/oauth/reference/get/oauth/authorize
のAPIのパラメータに認証許可用トークンを指定してユーザにアクセスしてもらう
許可されるとrequest_tokenのoauth_callback
で指定したURLにリダイレクトされて
アクセストークンを取得できる
WebサービスでのログインにTwitter認証を使う場合(?)
2.ユーザに認証許可用トークンを含むURLへアクセスしてもらい許可してもらう
3.アクセストークンをゲット
https://dev.twitter.com/oauth/reference/get/oauth/authenticate
のAPIのパラメータに認証許可用トークンを指定してユーザにアクセスしてもらう
が、WebサービスなのでURLリンクを表示するのでなくリダイレクトでAPIに直接飛ぶほうが早い
許可されるとrequest_tokenのoauth_callback
で指定したURLにリダイレクトされて
アクセストークンを取得できる
PIN認証
https://dev.twitter.com/oauth/pin-based
request_tokenのAPIのoauth_callback
にoobの文字列を指定するとPIN認証になる
アプリでの認証に使われるらしい
1. ツイッターから認証許可用トークン(リクエストトークン)を貰う
2.ユーザに認証許可用トークンを含むURLへアクセスしてもらい許可してもらう
3.許可したときにブラウザに表示されるPINと呼ばれる数字をユーザにアプリへ入力してもらう
4.PINの数字を使ってアクセストークンを取得する
1.と2.はcallbackの指定がoobなだけで前述のと手順は同じ
3.はアプリにPIN入力のUIを用意しとけばいいだけ
4.PINの数字を使ってアクセストークンを取得する
https://dev.twitter.com/oauth/reference/post/oauth/access_token
のAPIのoauth_verifierにPINの数字を指定して叩けばアクセストークンを取得できる
このAPIのレスポンスでユーザIDや表示名も取得になるぽい
アクセストークンを無事ゲットしたら
https://dev.twitter.com/oauth/overview/authorizing-requests
https://dev.twitter.com/oauth/overview/percent-encoding-parameters
https://dev.twitter.com/oauth/overview/creating-signatures
(ユーザ認証の必要ないデータの取得)
ツイッターの公開データにアプリからアクセスするためのアクセストークンの取得
アプリケーションオンリー認証というらしい
https://dev.twitter.com/oauth/application-only
https://dev.twitter.com/oauth/reference/post/oauth2/token
このAPIをBASIC認証(OAuth認証ではない)で叩いて
それで得られたアクセストークンを使ってBearer認証(OAuth認証ではない)を使って各種APIを叩く