プログラミングノート

一からものを作ることが好きなエンジニアの開発ブログです。

Railsではてな認証API

開発中のアプリではOpenIDを利用して認証することにしたので、手始めにはてな認証API使ってみました。

準備

1. APIキーの取得
はてな認証APIのページでAPIキーを取得して、認証を利用するアプリケーションの情報を登録。コールバックURLは、下記のように設定(localhostでも大丈夫でした)。http://localhost:3000/main/hatena_callback


2. ライブラリインストール

gem install hatenaapiauth

実装

# application.rb
protected
def authorize
  unless session[:user]
    flash[:notice] = "ログインしてください"
    redirect_to :action => "login"
  end
end

before_filterで利用するメソッドを追加しておきます。セッションにデータがない場合は、ログインページへ。

# main_controller.rb
require 'hatena/api/auth'

class MainController < ApplicationController
  before_filter :authorize, :only => :top

  HATENA_PARAMS = {
    :api_key=>"XXXXXXXXXXXXX",
    :secret=>"XXXXXXXXXXXXX"
  }

  def hatena_auth
    Hatena::API::Auth.new(HATENA_PARAMS)
  end
  helper_method :hatena_auth

  def hatena_callback
    begin
      hatena_user = hatena_auth.login(params[:cert])
      session[:user] = hatena_user["name"]
      redirect_to :action => "top"
    rescue Hatena::API::AuthError => e
      flash[:notice] = "認証に失敗しました"
      redirect_to :action => "login" 
    end
  end

  def login
    if session[:user] != nil
      flash[:notice] = "認証済みです";
    end
  end

  def logout
    session[:user] = nil
    redirect_to :action => "login"
  end

  def top
  end
end

HATENA_PARAMSには、APIキーと秘密鍵を入力。hatena_callbackが、はてな認証ページからコールバックでアクセスされるメソッドです。topメソッドのみ認証をかけています。

# login.html.erb
<a href="<%=hatena_auth.uri_to_login%>">はてなIDでログイン</a><br />
<%= flash[:notice] unless !flash[:notice] %>
# top.html.erb
ユーザ専用コンテンツ<br />
<%= link_to "ログアウト", :action => "logout" %>


以上で、簡単な認証ページができます。


Ruby用のライブラリが公開されていたし参考になるエントリもあったので、あまり悩むことなく実装できたのですが、Rails自体の動作で分からないことが多いのでまだまだ余計なことで時間を食ってしまいます。はやくストレスなく作れるようになりたい。。