Yammer は、元々は企業内用 Twitter 的な感じだったためか、シンタックスハイライトもなく、投稿のフォーマットが(Announce 機能を除き)できないというのもあり、エンジニアが利用するケースはあまりないかもしれません。(なによりスペースのインデント消すのは勘弁して欲しい。。)
が、私の所属する会社では結構ハードに使われていたりします。(と言っても、やはりエンジニアは Slack に居て、他の職種の人と話す用ですが )
OmniAuth を利用した例を説明するにあたり
OmniAuth 使わなくてもいい
今回は OmniAuth を利用しますが公式に提供されている yam
を使っても簡単に Yammer ログインは実装できます。
説明の前資料
ご存知の方は不要ですが、以降で出てくる Callback URI 等の命名や、突然 /auth/yammer
とか書き始めるのは、OmniAuth gem の方の README を見ていただくと「これか 」と思っていただけると思います。
Application の登録
Yammer にログインした状態で https://www.yammer.com/client_applications/ にアクセスすると、アプリケーションを登録できます。
Register New App ボタンを押すと以下のダイアログが出てくるので、内容を埋めて登録してください。
Redirect URI ですが、ここでは http://localhost:3000/auth/yammer/callback を入れておいてください。
localhost は 127.0.0.1 としてもいいのですが、以下のサンプルでは
localhost
で行うので合わせてもらった方がいいです。ここの設定と異る callback になると validate にひっかかるようです。
参考: https://developer.yammer.com/blog/action-required-please-make-this-simple-update-prior-to-august-25-2015
Rails アプリの設定
今回は Ruby 2.2.2, Rails 5.0.0.beta1 を使いました。
Gem の追加
gem 'omniauth'
gem 'omniauth-yammer'
gem 'dotenv-rails', groups: [:development, :test]
dotenv は必須ではないですが、以降
ENV
を利用するのでとりあえず。
.env ファイルの作成
先ほどの Application 登録で入手した Client Id と Client Secret を利用します。
YAMMER_KEY=Yammer の Client Id
YAMMER_SECRET=Yammer の Client Secret
initializer の作成
app/config/initializers/
に omniauth.rb
ファイルを作成します。
Rails.application.config.middleware.use OmniAuth::Builder do
provider :yammer, ENV['YAMMER_KEY'], ENV['YAMMER_SECRET']
end
通常の www.yammer.com 以外で運用している企業は
ENV['YAMMER_DOMAIN']
を指定する必要があるようですね。
Callback 受け取り口を作る
以下の通りですね。
https://github.com/intridea/omniauth#integrating-omniauth-into-your-application
ルートの追加
get '/auth/:provider/callback', to: 'sessions#create'
SessionsController の追加
class SessionsController < ApplicationController
def create
request.env['omniauth.auth']
# ここで認証後の情報が入っているので、user_id 等を取り出してアプリの方でユーザー情報を登録/検索等することになると思います。
end
end
試してみる
Rails サーバーを立ち上げ、http://localhost:3000/auth/yammer
とロケーションバーに入れると、ばSessionsController#create
に Callback が渡されてることが分かります。
ログイン済でないブラウザなら一度ログイン画面を経由することになると思います。
これ以降は
request.env['omniauth.auth'].credentials.token
でトークンが手に入るので、yam
を使うなり、直接 API を使うなりして認証ユーザーの情報を使ったアプリが作れますね。