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

mixi engineer blog

ミクシィ・グループで、実際に開発に携わっているエンジニア達が執筆している公式ブログです。様々なサービスの開発や運用を行っていく際に得た技術情報から採用情報まで、有益な情報を幅広く取り扱っています。

mixiへの認証を行ってくれる「OmniAuth-mixi」を公開しました

OAuth platform Ruby on Rails Ruby

こんにちは。よういちろうです。Ruby on RailsやSinatraで作るWebアプリケーションに各種認証機能を手軽に追加できる機構として、「OmniAuthシリーズ」があります。これのmixi版を作ってみました。

omniauth.png

OmniAuth-mixi - Github

OmniAuthは、Strategyという形式で任意の認証プロバイダの実装を追加できるようになっています。OmniAuth-mixiを使うことで、OAuth2にてmixi Graph APIの認証認可を行い、People APIで認可ユーザのプロフィール情報を取得する、という処理を行ってくれます。

使い方は簡単です。Ruby on Railsの場合、まずGemfileに以下を追記します。

gem 'omniauth-mixi'

次に、config/initializers/omniauth.rbファイルを以下の内容で作成します。

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :mixi, 'consumer_key', 'consumer_secret'
end

consumer_key、consumer_secretは、もちろんそれぞれmixiから発行されたものに置き換えます。準備はこれで完了です。簡単ですね!

実際のアプリケーション内でmixiのユーザ認証したくなった時には、mixi Graph APIの認証認可画面にリダイレクトさせます。と言っても、直接mixiの画面に飛ばすわけではなく、OmniAuth-mixiが提供してくれているリダイレクト先「/auth/mixi」に飛ばします。

redirect_to '/auth/mixi'

mixiの認証認可画面から戻ってくるときには、「/auth/mixi/callback」が呼び出されるようにしておきます。つまり、mixiへのサービス登録時に、redirect_uriとしてこのパスが呼び出されるように登録しておきます。コントローラにマッピングするために、routes.rbファイルに以下を記述します。この例であれば、SessionsControllerクラスのcreate()メソッドが呼び出されます。

match '/auth/mixi/callback', to: 'sessions#create'

素のOAuth2 + People APIの利用であれば、ここで「アクセストークンの取得」と「People APIのアクセス」をすることになりますが、そんなことはOmniAuth-mixiが忘れさせてくれます。気にすることは何もありません。全てOmniAuth-mixiが裏でやってくれます。

認証結果が欲しければ、コントローラの中から「request.env['omniauth.auth']」とアクセスすることで取り出すことができます。例えばsessions#createに対応するコントローラとして、以下のようなコードになるでしょう。uid()メソッドでユーザIDを、info()メソッドで認証されたユーザの情報を得ることができます。

class SessionsController < ApplicationController
  def create
    auth = request.env['omniauth.auth']
    @user_id = auth.uid
    @info = auth.info
  end
end

ビューであるerbファイルの中では、以下のように各情報を取り出すことになるでしょう。

<% %w(name first_name last_name description location nickname).each do |name| %>
    <%= simple_format(@info.send(name.to_sym)) %>
<% end %>
<img src="<%= @info.image %>" />
<a href="<%= @info.urls.profile %>">Profile page</a>

上記のコードはmixiに特化していますが、:providerやauth_hash['provider']を使うことで、mixiだけでなく他の認証プロバイダにも対応することができるようになるでしょう。

より詳しい情報は、OmniAuth-mixiのGithubページをご覧ください。

Ruby on RailsやSinatraを使ってWebサイトを構築されている方々、OmniAuth-mixiを使ってぜひ「mixiで認証・連携」をしてみてください!