リリースからお世話になってるサービスのコードが読みたいという動機。しかも masuidrive さんの Rails コード。
GitHub 認証の書き方から見ていこうかなと今日から始めます。

GitHub 連携ログイン認証

もはやおなじみの web サービス依存のログイン認証ですね。アカウントの製造とかログインの照合とかを全部他所に委託するタイプです。良い書き方を求めてお手本が丁度欲しかった感じです。

参照
maasuidrive/open-wripe

コードを読む

兎にも角にも初めに見たのは app/controller です。もっといい方法であたりをつけられるとは思いますが、正攻法で探してみました。
結局は後で GitHub のリポジトリ内検索を使ったんですが…
中を覗くと分かるんですが、明らかに GitHub 認証用だろうという controller があります。ghauth_controller ですね。

自分が作成しているライブラリの読み方

あぁこんな方法が。よくよく考えれば普通でした。
今まで config 弄る方法で適用していましたが、全てのコントローラに必要なモノでもない限りこれで良さそう。

認証失敗処理

要するに認証失敗時に with に登録してるメソッドを実行するするわけですが、トップページにリダイレクトかけるだけなので Proc を使ってるんでしょう。メソッドにするまでもねぇって奴。
変にメソッド化されても色々と無駄が多いので、人間のリソース (無駄に記憶したく無い事) を考えるとこれで十分っぽい。

sign_in 処理

oauth で認証する為に必要なページにリダイレクトしてます。ステータスの説明は oauth/parameters に書かれてます。

  • client_id
    github に登録してるアプリの id
  • scope
    oauth/scope ステータスに書いてます。
    scope を設定する事でアプリがアクセス出来る範囲 (ユーザ情報の事) と権限が変わります。
    今回の場合は email アドレスのみの読み取りが可能になります。

GhAuth.oauth は oauth2 によって URI を生成しているので使い方は intridea/oauth2 を参照。
open-wripe では下記ソースの用に設定されています。

site: には GitHub の API に関する API の URI を設定しています。形式は JSON です。
authorize_url: には GitHub のログイン認証のページ URI を、token_url: には GitHub へのアクセストークンの POST 用 URI を設定しています。

Octokit が URI を生成しているコード

ここまでのコードでコールバック迄の処理を行います。コールバックの際には GET で code パラメータを渡されるのでそのコードを使用すると GitHub にアクセス出来るます。これに関しては、次回にまわします。

まとめ

普段何気なく Web で見つけたコードのまま実行し、その情報で接続しますが、ライブラリや、サービス毎の細かい振る舞いに関して把握出来ていない部分が多くあるのが良くわかりました。自分からするとコロンブスの卵的な発想の手法が多く、やはり多くのコードを読む事と、プロトコルを理解する事が大事であると分かります。
また、実際に自分で一つずつ戻り値を確認する事も基本中の基本ですが、大事です。

確認に使用したコード。

今回は GitHub 認証の中の sign_in アクション迄を読んでみました。
いつもはざっくりにしか読まなかったり、コードの流用目的でしか読まなかったりするので、いつも以上に得る物が大きかったように思います。いつ終わるのか分からないですが、また、読んでいきたいと思います。次は callback のあたりとモデルに関しての部分になると思います。