3レッグ認証OAuthフローを使用したユーザーアクセストークンの取得
別のユーザーに代わってアクションを実行するには、そのユーザーのアクセストークンを取得する必要があります。アクセストークンは、リクエストを代行するTwitterアカウントを指定します。このため、アクセストークンを取得するには最初にアクセス権を付与する必要があります。 こうしたトークンには有効期限はありませんが、ユーザーによりいつでも取り消すことができます。
Twitterでは、3レッグ認証OAuthフローを介してユーザーのアクセストークンを取得できます。これにより、アプリケーションは、ユーザーをTwitterにリダイレクトして、アプリケーションを認証させることで、アクセストークンとアクセストークンシークレットを取得できます。このフローは、次の2つの例外を除いて、「Twitterでログインを実装」で説明したフローとほぼ同じです。
- GET oauth/authenticateの代わりに、GET oauth/authorizeエンドポイントが使用されます。
- すでにアクセスが許可されている場合でも、ユーザーはアプリケーションへのアクセスを認証するように常に求められます。
始める前に、アプリケーションの権限をチェックし、コンシューマーキーとコールバックURLを確認しておく必要があります。コールバックURLまたはパブリックアクセス可能なUIがない場合は、PINベースの認証の使用を検討してください。これは、認証後にユーザーをリダイレクトするために、ウェブブラウザーにアクセスできない、またはウェブブラウザーを埋め込むことができないアプリケーションを対象としています。
3レッグ認証サインインのインタラクションで可能性があるステータスが、以下のフローチャートに図示されています。
プロセスの概要
大まかに言うと、3レッグ認証OAuthプロセスは次のように実行されます。
- コンシューマーアプリケーションがリクエストトークンを取得するためのリクエストを作成します。
- ユーザーに認証してもらい、コンシューマーアプリケーションにリクエストトークンを送信します。
- リクエストトークンを使用可能なユーザーアクセストークンに変換します。
用語の説明
以下のガイドで、同じものを呼ぶさまざまな用語を確認できます。
クライアントの認証情報:
- App Key === API Key === Consumer API Key === Consumer Key === Customer Key ===
oauth_consumer_key
- App Key Secret === API Secret Key === Consumer Secret === Consumer Key === Customer Key ===
oauth_consumer_secret
- Callback URL ===
oauth_callback
一時的な認証情報:
- Request Token ===
oauth_token
- Request Token Secret ===
oauth_token_secret
- oauth_verifier
トークンの認証情報:
- Access token === Token === resulting
oauth_token
- Access token secret === Token Secret === resulting
oauth_token_secret
詳細な手順
手順1: POST oauth/request_token
コンシューマーアプリケーションがリクエストトークンを取得するためのリクエストを作成します。
このリクエストでの唯一の固有のパラメーターはoauth_callbackです。これは、手順2を完了した際にユーザーがリダイレクトされるURLのURLエンコードされたバージョンである必要があります。残りのパラメーターは、OAuth署名プロセスにより追加されます。
注: POST oauth/request_tokenエンドポイントで使用するコールバックURLは、開発者ポータルのアプリの詳細ページにある開発者アプリの設定内で構成する必要があります。
リクエストに含まれるもの:
oauth_callback="https%3A%2F%2FyourCallbackUrl.com"
oauth_consumer_key="cChZNFj6T5R0TigYB9yd1w"
アプリが応答のHTTPステータスを確認する必要があります。200以外のすべての値は失敗を示します。応答の本文には、oauth_token
、oauth_token_secret
、oauth_callback_confirmed
のパラメーターが含まれます。アプリは、oauth_callback_confirmed
がtrueであることを検証し、次の手順のために他の2つの値を保存する必要があります。
応答に含まれるもの
oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0
oauth_token_secret=veNRnAWe6inFuo8o2u8SLLZLjolYDmDP7SzL0YfYI
oauth_callback_confirmed=true
手順2:GET oauth/authorize
ユーザーに認証してもらい、コンシューマーアプリケーションにリクエストトークンを送信します。
ユーザーをリダイレクトするURLの例:
https://api.x.com/oauth/authorize?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0
認証に成功すると、callback_url
はoauth_token
とoauth_verifier
のパラメーターを含むリクエストを受け取ります。アプリケーションは、トークンが手順1で受信したリクエストトークンと一致することを検証する必要があります。
クライアントのリダイレクトからのリクエスト:
https://yourCallbackUrl.com?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY
手順3:POST oauth/access_token
リクエストトークンを使用可能なアクセストークンに変換します。
リクエストトークンを使用可能なアクセストークンにレンダリングするために、アプリケーションは、手順2で取得したoauth_verifier
の値を含む、POST oauth/access_tokenエンドポイントにリクエストする必要があります。リクエストトークンはヘッダーのoauth_token
部分でも引き渡されますが、これはサインインプロセスで追加されます。
リクエストに含まれるもの:
POST /oauth/access_token
oauth_consumer_key=cChZNFj6T5R0TigYB9yd1w
oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0
oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY
成功した応答にはoauth_token
、oauth_token_secret
のパラメーターが含まれています。トークンとトークンシークレットは、今後認証されるTwitter APIへのリクエストに使用するために保存してください。ユーザーのIDを判断するには、GET account/verify_credentialsを使用します。
応答に含まれるもの:
oauth_token=7588892-kagSNqWge8gB1WwE3plnFsJHAZVfxWD7Vb57p0b4
oauth_token_secret=PbKfYqSryyeKDWz4ebtY3o5ogNLG11WJuZBc9fQrQo
OAuth 1.0a(アプリケーションユーザー)を必要とするリクエストでのこれらの認証情報の使用
これでユーザーアクセストークンを取得できました。これらを使用すれば、POST statuses/updateなどの特定のAPIにアクセスし、ユーザーに代わってツイートを作成できます。
リクエストに含まれるもの:
POST statuses/update.json
oauth_consumer_key=cChZNFj6T5R0TigYB9yd1w
oauth_token=7588892-kagSNqWge8gB1WwE3plnFsJHAZVfxWD7Vb57p0b4
サンプルユースケース
標準フローはウェブベースで、3レッグ認証OAuthフローを使用します。次に示すスクリーンショットはサンプルの一部で、そのソースはhttps://github.com/twitterdev/twauth-webで確認できます。
アプリケーションのどこかの時点で、Twitterにリダイレクトしてアプリケーションを認証する必要があります。リクエストトークンを使用してTwitterにリダイレクトすると、ユーザーにアプリケーションの認証を促すメッセージが表示されます。アプリケーションを認証すると、リクエストトークンを生成したときに提供したコールバックURLにユーザーがリダイレクトされます。これを使用して、このユーザーで永久的なアクセストークンを取得し、ローカルで保存します。