omniauth-atlassianでJIRAやConfluenceのアカウントで認証する社内サービスを作る
まえおき
「社内の組織ユーザだけが使う便利サービスを、Herokuとかにデプロイしてみんなに使ってもらいたい。」
ってことはよくあります。
でもさすがに認証しないわけにはいかないので、とりあえずomniauth-githubとかomniauth-google-oauth2あたりを使って認証の実装を適当に追加してみんなに使ってもらう。
だいたいのユースケースではこれで十分です。
しかし、JIRAとかConfluenceの情報を集約して何かレポートを生成するような社内ツールを作りたくなったとしましょう。
その場合には必然的にJIRAのOAuth2を使おう、ってなりますね。しかしそのOAuth2、なかなか思うように使えません。社内向けの業務改善用Webサービス作りたいだけなのに、すんごいめんどくさいんです。
アトラシアンのOAuth2
ハマリポイント1こめです。
bitbucketにはOAuth2の機能が提供されています。
JIRAにはOAuth2の機能が提供されている(昔はされていた?)っぽいです。omniauth-jiraというAtlassian公式のGemがあります。
実際にそれを使っているっぽい記事もあります。 OAuth2なのに、なぜかopensslコマンドを叩く手順があるのが若干謎だなーと思えますが、まぁそういうもんらしいです。ただ、このJIRAのOAuth2はおそらく多くの人が求めているものではありません。JIRA APIを叩いて、バグチケットの情報を取得したいだけなのに、このスコープは何を選べば良いんだ?(しかも必須項目)
はい、そんなわけで、正解は、こちら。
こっちのOAuth2を使うと、素直にJIRA APIを叩くためのアクセストークンを発行するようなOAuth2フローが作れます。
手順を書こうと思ったんですが、Qiitaの方にすでにスクリーンショット付きで丁寧に書いてる方がおられました。そちらをぜひ御覧ください。
これをOmniAuthで使うための(非公式な)ライブラリがあって、それがomniauth-atlassian-oauth2です。
使い方的には、omniauth-githubなどとほぼほぼ同じです。
Rails.application.config.middleware.use OmniAuth::Builder do
provider(:atlassian_oauth2, ENV['ATLASSIAN_CLIENT_ID'], ENV['ATLASSIAN_CLIENT_SECRET'], {
scope: "read:jira-user read:jira-work write:jira-work",
prompt: "consent",
})
end
社内の人にWebサービスを使ってもらうためには...3営業日かかる
ハマリポイント2個めです。
実際にomniauth-atlassian-oauth2を使って、JIRA認証ができて、ローカル確認もOK。Herokuにもデプロイした。さあみんなに使ってもらおう!としたときに、
こんなエラー画面が出るんです。
よーくDeveloper Consoleの方を見てみると・・・なんか気になることが書いてあります。
privateなので、 Only You can Install and Use it.
といいつつ、インストールもクソもない。ただ単純にみんな使えなくて困る。それはわかった。
じゃあみんなに使ってもらえるようにPublicに・・・もできない。ちっちゃーく書いてるのが
「アプリをPublicにしたければ、サポートチケットを発行してね♪」
まじかよ。
サポートチケットを発行する前に... Privacy Policyの準備
申請フォームは↓のような感じで、冒頭に「数日間かかるよ」って書いてる。
ここで、プライバシーポリシーというものを必須で入れないといけない。
社内向けの便利ツールなのに、プライバシーポリシーなんてあるわけないだろ!! とりあえず用意するしかない。
diff --git a/config/routes.rb b/config/routes.rb
index 161aef3..e70f74e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -6,6 +6,11 @@ Rails.application.routes.draw do
end
end
+ # 認証なしで誰でもアクセスできるルート
+ namespace :public do
+ get '/privacy_policy', to: 'pages#privacy_policy'
+ end
+
get '/auth/atlassian_oauth2/callback', to: 'sessions#login_with_atlassian'
get '/logout', to: 'sessions#logout'
end
class Public::ApplicationController < ::ApplicationController
skip_before_action :authorize!
end
class Public::PagesController < Public::ApplicationController
layout false
# GET /public/privacy_policy
def privacy_policy
end
end
あとは、app/views/public/pages/privacy_policy.html にプライバシーポリシーを記載した生HTMLファイルを置けば完成。
プライバシーポリシーは、ぶっちゃけ社内向けには誰も読まないので、形だけあればよく、
ぐぐったら何でも出てくるので、好きなのを使って自動生成すればよい。
https://<yourappname>.herokuapp.com/public/privacy_policy
を申請フォームに記入して、送信する。
サポートチケットを発行直後、自動応答で追加の入力依頼が来る
サポートチケットを発行すると、直後に↓のような自動応答メッセージが返ってくる。
よく見ると、単純な「受け付けたよ」通知ではなく、質問事項がいくつか書いてある。申請フォームにある内容もあるし無い内容もある。(なぜ申請フォーム1個にせんかったんや....アトラシアン.......)
ともかく、この質問内容は1項目を除き機械的に回答可能なので、すぐに回答しよう。
1つ、 Is this app for internal or external use?
のところだけが考慮点。今回は社内ユーザに便利ツールを使ってもらうので、internal useといえるだろう。internalツールだけど、社内みんなが使うよ、というのを素直に書いた。
数日待つと、Publishできるようになる
本当にただ待つだけ。「3営業日かかります」の商習慣ここにあり。↓のようなメッセージが来たら完了。
あらためてDeveloper Consoleを見に行くと、Publishできるようになっている。
あとは、これをポチッとやって、Saveボタンを押すと、みんなが使えるようになる。
めでたしめでたし。
次からは、3営業日待たなくてもいい
これは確証はとれていませんが、おそらく一度申請してしまえば、次に別のOAuth2アプリを作るときにも、Publish Appのためのサポートチケット発行が不要になります。
まとめ
- atlassian/omniauth-jira (公式Gem)は使えない。omniauth-atlassian-oauth2を使おう。
- 自分だけが使うアプリなら不要だが、社内メンバーが使うアプリだと、3営業日程度かかる申請が必要。
- omniauth-google-oauth2やomniauth-githubなどに比べると、だいぶ実装に時間がかかる。
Discussion