techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Github APIを使ってOAuth2を理解してみる

OAuth2で認証し、Githubのデータにアクセスしてみましょう。
ライブラリなどを使うと簡単にアクセスすることはできると思いますが、その中で何をやっているかを理解するためにブラウザとcurlを使って通信し、手動で一つ一つ動作せてみましょう。

OAuthの特徴はパスワードを知ることなく特定のサービスのデータを取得や操作ができるようにできることになります。
そのためにやらないといけないこととしては次の事になります。

  • OAuth アプリケーションの登録
  • 認証
  • アクセストークンの取得
  • データアクセス

データへアクセスするためにはデータアクセスまでに次の情報を集める必要がああります。

  • Client ID
  • Client Secret
  • code
  • アクセストークン

これらの情報を収集することができればデータのアクセスが可能です。
それぞれのデータの取得方法についてご説明します。

OAuthアプリケーションの登録

まずはGithubのアカウントにOAuthアプリケーションの登録をします。
これはGithubのサービスでアプリケーションを登録するとアクセストークンを取得するためのClient IDとClient Secret取得することができます。
登録はユーザーアカウントのSettings>OAuth Application>Developer applicationsを選択します。

f:id:muchiki0226:20160409235307p:plain:w400

ここで右上のRegister new applicationをクリックすると次のような画面に遷移します。

f:id:muchiki0226:20160409235310p:plain:w400

項目 概要
Applicaiton name OAuthで認証するアプリケーションのサービス名を設定します
Homepage URL アプリケーションのホームページURL
Applicaiton description アプリケーションの説明
Authorization callback URL OAuth認証が完了した時に遷移するURL設定

登録するこのような表示になります。

f:id:muchiki0226:20160409235313p:plain:w400

画像上のオレンジの部分にClient IDとClient Secretが生成された値が表示されます。
これ以降の内容はClient IDとClient Secretを利用してデータの取得を実施していきます。

認証

OAuthアプリケーション登録することができたのでそのデータをアクセスするためにはまずはユーザの手で許諾をいただくことが必要です。
許諾が貰えるとアクセストークを取得するために必要な最後の鍵であるcodeが取得できます。

まずはClient IDを使って認証をもらいます。
認証をもらうためには次のURLをブラウザで表示します。

https://github.com/login/oauth/authorize?client_id=<Client ID>

/login/oauth/authorizeのパスにパラメータでclient_idをつけます。
ここでのclient_idはOAuthアプリケーションの登録時に生成されたClient IDを用います。

このページを表示すると認証ページが表示されます。
Githubのアカウントを持っている人はアカウントのIDとパスワードを入力するか、すでにログイン済みの状態の場合は次のような画面が表示されます。

f:id:muchiki0226:20160409235316p:plain:w400

Authorize applicationのボタンをクリックすると次のURLに遷移します。

<OAuthアプリケーションの登録時のAuthorization callback URL>?code=<Githubが生成した値>

ここで得られるcodeが次のアクセストークンに必要になるためメモります。

アクセストークンの取得

さてここでアクセストークンを取得するために必要な次の3つの情報を取得できました。

  • Client ID
  • Client Secret
  • code

これらの情報を使ってcurlを使ってアクセスしてみましょう。

$ curl https://github.com/login/oauth/access_token?code=<認証で得られたcode>&client_id=<OAuthアプリケーションの登録時のClient ID>&client_secret=<OAuthアプリケーションの登録時のClient Secret>

これを呼び出すと下記のデータが返却されます。

access_token=<アクセストークン>&scope=&token_type=bearer

これでアクセストークンを取得できました。

データアクセス

Github APIにアクセスする時に取得できたアクセストークン付与することでデータにアクセスができます。
今回は例でユーザー情報を取得してみましょう。
ユーザー情報を取得するには次のURLをcurlで呼んでみます。

$ curl "https://api.github.com/user?access_token=<得られたアクセストークン>"

これを実施すると次のようなJSONデータが取得できます。

{
  "login": "XXXX XXXX",
  "id": XXXXX,
  "avatar_url": "XXXX",
  "gravatar_id": "XXXX",
  "url": "https://api.github.com/users/XXXXX",
  "html_url": "https://github.com/XXXXX",
  "followers_url": "https://api.github.com/users/XXXXX/followers",
  "following_url": "https://api.github.com/users/XXXXX/following{/other_user}",
  "gists_url": "https://api.github.com/users/XXXXX/gists{/gist_id}",
  "starred_url": "https://api.github.com/users/XXXXX/starred{/owner}{/repo}",
  "subscriptions_url": "https://api.github.com/users/XXXXX/subscriptions",
  "organizations_url": "https://api.github.com/users/XXXXX/orgs",
  "repos_url": "https://api.github.com/users/XXXXX/repos",
  "events_url": "https://api.github.com/users/XXXXX/events{/privacy}",
  "received_events_url": "https://api.github.com/users/XXXXX/received_events",
  "type": "User",
  "site_admin": false,
  "name": "XXXXX",
  "company": XXXXX,
  "blog": XXXXX,
  "location": XXXXX,
  "email": "XXXXX",
  "hireable": XXXXX,
  "bio": XXXXX,
  "public_repos": XXXXX,
  "public_gists": XXXXX,
  "followers": XXXXX,
  "following": XXXXX,
  "created_at": "XXXXX",
  "updated_at": "XXXXX"
}

Githubの場合はパラメータでaccess_tokenを取得する方法以外にHTTPヘッダのAuthorizationにアクセストークンを設定したとしてもデータを取得できます。
そのため次の呼び出し方でも同じ結果を得ることができます。

$ curl -H "Authorization: token <得られたアクセストークン>" https://api.github.com/user

今回はユーザー情報を取得するAPIでしたが、他にOrganizationやリポジトリ情報、コミットについてなどの情報も取得できます。 それぞれのアクセスするAPIは こちらから調べて使ってみてください。