Digital Identity 技術

Authentication = 「認証」(本人確認), Authorization = 「認可」(リソースへのアクセス許可). Authorization Endpoint は「認可エンドポイント」. Authentication Request は「認証要求」.

Webサービスその他での伝統的なユーザID + パスワードによる認証では、当然にそのサービスの認可を兼ねることが通常なので、用語が混乱しやすい。Open ID Connect などの技術は、本人確認だけを別サーバに分離する。

OpenID Connect

ソフトウェア

別セクション.

omniauth-openid-connect 'renewed' OmniAuth (Ruby) 用の OpenID Connect ストラテジ。OpenID Connect をサポートする複数の IdP に対して、一つのパッケージで対応。

記事

OpenID Connect 'response_type' and flows Authorization Request (認証要求) に含まれる response_type で、フローが決定される。有効な組み合わせについて。

Links

OAuth 2.0 + OpenID Connect のフルスクラッチ実装者が知見を語る OpenID Provider (OP; IdP) を作るのは、非常に難しい。

エンタープライズITでのOpenID Connect利用ガイドライン Just-In-Time User Provisioning / Identity Provisioning

Ruby on Rails の認証フレームワーク

メンテナンスされているもので候補になりうるのは, Devise, Sorcery, Clearance そして Authlogic の4択。any_login (開発環境で別ユーザに切り替える.) でもこの4つがサポートされている。

改めて確認すると, Sorcery がシンプルでよさそう。

Devise

heartcombo/devise: Flexible authentication solution for Rails with Warden.

2021.4.29 v4.8.0. メンテナンスされている。Warden を基盤としている。warden ~> 1.2.3; railties >= 4.1.0 (Rails 専用)

Rails 向けではほぼ一強。しかし複雑すぎる。まれに脆弱性報告があるので、きちんと付いていかなければならない。

  • ドキュメントが分かりにくい。機能が複雑すぎるか。
  • OpenID Connect など認証を外だしするなら、ほとんどの機能は不要?
  • OmniAuth との統合? -- OmniAuth が廃れたので、これは考慮不要。

▲ Devise v4.8.1 (2021-12-16) でもまだ Rails 7 に対応していない。

☆ Sorcery

Sorcery/sorcery: Magical Authentication

2021.4.30 v0.16.1; oauth ~> 0.5, oauth2 ~> 1.0. 累計 2.7Mダウンロード. メンテナンスされている。Rails に依存していない Good。

新しいライブラリ。Authlogic, Devise にインスパイアされた。Magical Authentication がコンセプト. 魔法だが, Voodoo ではない。黒魔術全開の Devise とは違う、という意味か。

多数の外部 providers を備える。Google, LINE ほかいろいろ。OpenID Connect には未対応か? 単に oidc ライブラリと組み合わせればよい。難しくない。

単純な作りであり、Rails 7 でも問題なし。

▲ Authlogic (Aだけ大文字)

binarylogic/authlogic: A simple ruby authentication solution.

こちらも Rails 3 世代だが、まだメンテナンスされている。シンプルのRails認証ソリューション。2021.02.23 v6.4.1; Rails >=5.2,<6.2. 累計6.3Mダウンロード

v6.4.2 (2021-12-22) にて Rails 7 対応。

オプションの別パッケージは廃れている;

  • authlogic-connect -- OpenID であって OpenID Connect ではない。使えない。
  • authlogic-oauth -- 2009年で終了。

▲ Clearance

thoughtbot/clearance: Rails authentication with email & password.

Rails 3 世代の認証フレームワークだが、まだメンテナンスされている。2021.04.09 v2.4.0; Rails >= 5.0. 累計 950Kダウンロード。

Rails 限定. メールとパスワードに特化。 ... いくら何でも機能不足か. 外部認証が中心なら、意外とこれぐらいでもいいかもしれないが、ちょっと試す気が湧き上がらない。

公開鍵基盤 (PKI)

CA階層, 2/3 tierと基礎 CA.plスクリプトの解説はこちら。

2 tierプライベート認証局を作る

プライベート認証局でSSLサーバ証明書, nginxでの TLS設定

SSLクライアント証明書でユーザ認証 (nginx)

S/MIME @todo

コード署名 (Code signing) Windows環境 (UWP) では, バイナリに署名しないと実行できなくなっている.

サンプルプログラム

openid_connect_sample

[2021.12] v2.0.0 リリース.

OpenID Connect OP (IdP) 実装サンプル。nov/openid_connect_sample を fork し, Ruby on Rails 6.1対応した。Authorization Code Flow と Implicit Flow をサポート。

同時に, OpenID Connect Relying Party (RP) として Googleログイン。

Ruby on Rails 6.1, Sorcery, Facebook Login の組み合わせ。

Implicit Flow RP sample

ネイティブアプリなど client_secret を安全に保存できない状況では, Implicit Flow を使わなければならない。

Rails アプリではサーバサイドの Authorization Code Flow で問題ないが、あえて Implicit Flow を実装した OpenID Connect Relying Party (RP) サンプル。

netsphere-labs/openid-connect-implicit-flow-rp-sample: OpenID Connect (oidc) - Relying Party (RP) sample. The Implicit Flow, Ruby 3.0 + Ruby on Rails 6.1. Tested Google and Yahoo JP.

Rails 6.1. IdP として Google と Yahoo JP に対応。

Sorcery 2FA Sample

netsphere-labs/sorcery_twofactor_sample: Sorcery 2FA sample. Rails 7

ベーシックなパスワード認証と Google Authenticator (Google 認証システム) で生成される確認コードの入力を組み合わせた、2要素認証のサンプル。

二要素認証 (2FA) は, "知識" 本人のみが知っていること (例: 暗証番号) と, "所有" 本人が持っているもの (例: スマフォ) を組み合わせた認証。所有のほうは、それだけでは本人確認にならないので、あくまでも「知識」を補完する位置づけ。例えば、パスワードをほかのサービスと共通のものを使っているような場合で、それが漏洩したとしても、ただちに破られないようにする。

Google Authenticator を使うこのサンプルは, SMS (ショートメッセージ) よりも, 非常に実装が簡単。

Ruby 3.1, Ruby on Rails 7, Sorcery, google-authenticator-rails の組み合わせ.

本当は、スマフォの紛失に備えてリカバリ方法を用意しなければならないが、そこは手つかず。