読者です 読者をやめる 読者になる 読者になる

ここにタイトルが入ります

デザイン&プログラミングのことも書くし、それ以外のことも書く。

【github、Rails】githubを使ってみよう! deviseでAOuth〜情報取得

my works ruby web service Rails

今回はgithubより情報を取得してみます!

githubはプログラマにはお馴染みのソース(プロダクト)管理サービス?ですよね。
最近Railsアプリでgithubのwebapiを使うことがあったので、簡単にまとめておこうと思います。


公式サイト(ガイド)はコチラ
GitHub API v3
ここ見れば全部使い方書いてあります☆


AOuth認証

アプリケーションからgithubユーザーのアカウントから情報を取ってくるためには、
AOuth認証を使ってトークンをもらう必要があります。

Githubにアクセス→ユーザーがアプリケーションに情報取得許可を出す→アプリ側にトークンが渡される

といった流れになっており、このトークンが「許可証」になっているので、
github apiにリクエストを送る場合は常にトークンをセットにする必要があります。



アプリをgithubに登録

Oauth認証を行うには、サービスにアプリを登録をする必要があります。
githubにログインして、右上の「account setting」→「applications」を選択します。
f:id:blog_711fumi:20120702005056j:plain
↑のような画面が出てくるので、サービス名、サイトのURI、callback uri(認証後戻ってくるURI)を入れて登録。

するとClient ID、Client Secret(key)が割り当てられるので、メモっておいてください。



deviseでのAouth認証

で、rails(ruby)でAOuth認証を実装するには「omuniauth」というgemを使うと楽です♪
今回はそれを組み込んだ?認証ライブラリ?である「devise」を使って
github認証〜情報取得をおこなってみたいと思います。


…ただ今回deviseの使い方は割愛しますすみません(^_^;)
未だに良くわかってないし。。


〜いろいろ参考にさせて頂きました!〜
omuniauthの参考に:Railsでomniauthを使ってtwitter,facebookの簡単ログイン認証
deviseの参考に: [Rails] OmniAuth + Device で認証する① : ノンプログラマー ブログ


devise(というかomniauth)にはどうやらstrategyというモノが用意されているようで、
使用するサービスに対応したstrategyを使用することで簡単にAOuth認証が実装できるようです。


↓有名なサービスはほとんど用意されている↓
List of Strategies · intridea/omniauth Wiki · GitHub

もちろん今回はgithub用のstrategyをインストールします。
Gemfileに追加してbundle install。

gem 'devise'
gem 'omniauth-github'


その他deviseについての詳細は割愛しますが、下記の例なんか参考になるんじゃないでしょうか?
Facebookで認証する場合の例です。
OmniAuth: Overview · plataformatec/devise Wiki · GitHub

deviseの設定は主にrailsルート/config/initializers/devise.rbに書きますが、
AOuthの設定はこのように書きます。

config.omniauth :github, "app id", "app seacret", :scope => 'user,public_repo'

先ほど控えておいた「app id」と「app seacret」を引数2つめ、3つめに渡してください。

あと:scopeですが、もし更新や削除と言った操作をする場合に設定が必要です。
参照
読み取りだけなら設定なしでOK!


※ローカル環境で動かす場合、
「SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed」
のようなエラーが出る場合があります。

その場合はsslの設定も追加してあげる必要があります。
私はローカル(ubuntu)で動かすときは以下のように記述していました。

config.omniauth :github, "app id", "app seacret", :scope => 'user,public_repo', :client_options => {:ssl => {:ca_path => '/etc/ssl/certs'}}

なんかssl設定ディレクトリのパスを指定してあげなきゃいけないみたいですね。


情報の取得

devise(omuniauth)を使ってAOuth認証できたら、認証に使うトークンが返ってくると思います。
それを使ってリクエストをgithubに投げます。


例えばuser情報を取得する場合、

https://api.github.com/user?access_token="hoehogehogehoge"

のように、パラメータにアクセストークンを常にくっつけてリクエストします。


どんな情報がどんなURIで取得できるかは、
GitHub API v3
にしっかり書いて有りますよ☆


rubyでhttpリクエストを投げるなら、Getだけならopen-uri、
POSTやDELETEなんかも投げるならnet/httpなどの標準添付ライブラリを使うのが一般的でしょうか。



ちょっと今回は中途半端なわかりにくい解説になってしまいましたね。。
怪しげな記事になってしまいましたが…
github使ってみたメモでした。