ククログ

株式会社クリアコード > ククログ > > クリアコード年表アプリにアカウント連携を組み込みました #cc20th

クリアコード年表アプリにアカウント連携を組み込みました #cc20th

今月末に、クリアコード20周年記念Meatupが開催1されます。

設立20周年を記念するこのイベントではクリアコード年表公開!#cc20thとアナウンスがあったように、 コンテンツの1つとして「クリアコード年表」というアプリを公開しています。

「クリアコード年表」は設立してからクリアコードがどのようにフリーソフトウェアとビジネスの両立をしてきたかを、タイムラインで表示するものです。

自由にコメントを寄せてもらえるように、年表アプリにアカウント連携のしくみを導入しました。 今回は、年表アプリへのアカウント連携組み込みのさわりを紹介します。

どのアカウントと連携できるようにするか

クリアコードは、これまでさまざまな自由な(場合によっては不自由なこともある)ソフトウェアの開発に関わってきました。 そのため、GitLabとのアカウント連携ははずせません。 実際、自分たちでもGitLabのインスタンスを運用して活用しています。2

クリアコードとこれまで関わりのあったお客さんは、かならずしもGitLabに馴染みがあるとは限りません。より間口を広げるため、GitHubのアカウント連携にも対応することにしました。2

どのようにアカウント連携を実現するか

今回実装した20周年アプリは、普段触っていない技術で作ってみようということで、Rails 8を採用しました。 20周年記念イベント開催までの限定された期間だけ稼働する予定のものなので、素早く立ち上げられることが 大事だったからです。

社内にはRubyに詳しい人も多いので、みんなであれこれいじりやすいだろうという目論見もありました。

アカウント連携については、Devise + OmniAuthに落ち着きました。 以下のようなgemを利用することで、比較的低コストで実現できました。

...
gem 'omniauth-gitlab'
gem 'omniauth-github'
gem 'omniauth-google-oauth2'
gem 'devise-jwt'

今から思えば、 組み込みの認証ジェネレータとOmniAuthを組み合わせたほうがシンプルに実現できた気もします。

今回のアカウント連携での知見としては次のようなものがありました。

  • GitLabとセルフホストしているGitLabのインスタンス双方のアカウント連携を実現するにはどうするとよいか
  • 複数のアカウント連携を実現するにはどのようなテーブル設計にするとよいか
  • アカウント連携の可否を決定するプロバイダー側のアプリをどのように登録するとよいか

1つめのセルフホスト版のGitLabとのアカウント連携については

といった工夫が必要でした。

2つめのテーブル設計については、アカウント連携を実現する対象となるプロバイダーと、プロバイダーにおけるUIDの組み合わせを一意に特定するための いわゆる中間テーブルを導入しました。これにより、年表アプリに様々なアカウントからログインできるようになりました。

3つめの、プロバイダー側のアプリについては、プラットフォームごとに流儀がばらばらであることがわかりました。

GitHubの場合は、Developer SettingsのOAuth Appsとしてアプリを登録します。

GitHubのアプリ設定画面

GitLabの場合は、User SettingsのApplicationsにアプリを登録します。 このとき、アプリにはread_userおよびopenidの権限を付与します。

GitLabのアプリ設定画面

Googleの場合、Google Cloud Consoleにプロジェクトを作成し、作成したプロジェクトのAPIとサービスに ある認証情報ページにて「認証情報を作成」から「OAuthクライアントID」を選択することでアプリを登録できます。 公開ステータスも適宜設定する必要があり、既定のテスト公開の状態だと外部のアカウント連携に制限がかかることもわかりました。

Googleのアプリ設定画面

さいごに

今回は、クリアコード年表アプリへのアカウント連携を組み込むにあたってのさわりの知見を紹介しました。 コード自体は自由なライセンスで公開しています。

ぜひ皆さんのクリアコードにまつわるエピソードを年表アプリへとコメントしてみてください。

年表アプリは、https://20th.clear-code.com/ にて公開しています。

  1. 申し込みは https://clear-code.connpass.com/event/393654/ から行えます。

  2. 間口を広げるという意味でGoogleアカウント連携にも対応していたのですが、諸事情から削除しました。知見の共有のため、Googleアカウント連携に関する記述はそのままにしています。