コマンドライン上でOAuth APIを通じてリソースを利用してみる

OAuthとは、リソースオーナーがクライアントに対してリソースサーバが保有する自身のリソースの利用を認可する仕様であり、本来リソースオーナーが直接利用するものではありません(自身のリソースを使うなら認可は要らないはず)。

f:id:mmorita44:20170717145637p:plain

OAuth - Wikipedia

リソースオーナーがリソースを利用する場合はBasic認証APIを用いればよいのですが、Basic認証APIをサポートしないサービスが散見されます。この場合にはOAuth APIを利用するしかありません。

というわけで、今回はコマンドライン上でOAuth APIを通じてリソースを利用する方法について説明します。以降の手順では、Basic認証APIをサポートしないサービスの代表格であるPocket APIを例として用いています。

手前味噌ながらPython3専用のPocket APIライブラリ「py3pocket」も以下の手順を元に作成したものです。良かったら使ってみてください。

手順

手順へ入る前に、PocketのOAuthフローについて確認しましょう。

ここでのユーザはOAuthの定義から言うところのリソースオーナー且つクライアントであり、PocketのWebサーバ(以降Pocketサーバと省略)はリソースサーバ且つ認可サーバとなります。図で表すと下図のような感じでしょうか。

f:id:mmorita44:20170717162942p:plain

PocketのOAuthフロー

なお、Pocketでは認可グランドはPocketサーバから発行されるリクエストークンが該当し、ユーザへの認可はその後に行ないます。

1. 先ずは認可を済ませる

コマンドライン上からOAuth APIを利用するには、そのユーザに対して予めリソース利用を認可しておく必要があります。Pocketではリクエストークンを取得した後に 認可ページを表示します。認可を終えた後、認可継続のため指定URLへリダイレクトします。これでOKです。

f:id:mmorita44:20170717162517p:plain

認可ページ

ちなみに、py3pocketではauthorize関数がこの処理に該当します。

2. セッションを予め取得する

「4. 認可処理継続のためのリダイレクトを回避する」で後述するように、リダイレクトを回避するためにPocketサーバからセッションを取得しておきます。

3. リクエストークンを取得する

リクエストークンはPocketで用いられる認証グランドの形態で、Pocketサーバへ認可要求することにより取得します。ユーザを認可ページへ誘導させる際に併せて送付することになります。

4. 認可処理継続のためのリダイレクトを回避する

通常はユーザを認可ページへ誘導し、認可をもらい、その後認可処理継続のために指定URLへリダイレクトします。しかし、「1. 先ずは認可を済ませる」及び「2. セッションを予め取得する」を予め行っていれば、このリダイレクトを回避してもそのまま認可処理は継続できます。そのため、ここではユーザを認可ページへ誘導するリクエストだけ投げておきます。

逆に言うと、ここでリダイレクトが発生せずに認可ページが表示される場合は認可が済んでいないということになります。そうなった場合には、「1. 先ずは認可を済ませる」もしくは「2. セッションを予め取得する」が済んでいるかどうか確認してください。

5. リクエストークンをアクセストークンへ変換する

Pocketサーバを通じてリクエストークンをアクセストークンへ変換します。

6. OAuth APIを通じてリソースを利用する

OAuth APIを通じてPocketサーバへリクエストを投げることで、リソースを利用することができます。リクエストの際には、コンシューマキーとアクセストークンをPOSTパラメータとして設定する必要があるためお忘れなく。

最後に

上記の手順はPocketのOAuth APIを利用することを前提としていますが、他のサービスでも活用できるかと思います。ぜひ試してみてください。