rabbit-slide-znz-devise-two-factor-from-4-to-5 2024.8.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: db984cb347bdc1cd17552dc6c76380a67b5b44d82ead2eb59de5599d4eefc43c
4
+ data.tar.gz: 7854cafdcb19c84c66166ca74f7e21070f19a18f45f62641bf6a116cefc0f5d7
5
+ SHA512:
6
+ metadata.gz: c44ee511b78cd862eaf0b3a30368f5f98a4e8b444b764911887427b81923fb14fda55ae894eb941e070a7291695ea43b0eb98d96392ff2f36db8af1a219ab2ca
7
+ data.tar.gz: 8d41fb0f81f17c5ee49d30a955ba6cb99f68c2018c99d2fef4bc469d9f7059d747bfe5575f2c878a2b8e6b32fd5a24383acb8e0b9dc625ea6361c54edda82da6
data/.rabbit ADDED
@@ -0,0 +1,2 @@
1
+ --size 800,600
2
+ devise-two-factor-from-4-to-5.md
data/README.md ADDED
@@ -0,0 +1,23 @@
1
+ # devise-two-factorを4.xから5.xに上げた話
2
+
3
+ [大阪Ruby会議04](https://regional.rubykaigi.org/osaka04/)のスポンサーLTの発表資料です。
4
+
5
+ ## 作者向け
6
+
7
+ ### 表示
8
+
9
+ rake
10
+
11
+ ### 公開
12
+
13
+ rake publish
14
+
15
+ ## 閲覧者向け
16
+
17
+ ### インストール
18
+
19
+ gem install rabbit-slide-znz-devise-two-factor-from-4-to-5
20
+
21
+ ### 表示
22
+
23
+ rabbit rabbit-slide-znz-devise-two-factor-from-4-to-5.gem
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ # spec.files += Dir.glob("doc/**/*.*")
9
+ # spec.files -= Dir.glob("private/**/*.*")
10
+ # spec.add_runtime_dependency("rabbit-theme-YOUR-THEME")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
data/config.yaml ADDED
@@ -0,0 +1,24 @@
1
+ ---
2
+ id: devise-two-factor-from-4-to-5
3
+ base_name: devise-two-factor-from-4-to-5
4
+ tags:
5
+ - ruby
6
+ presentation_date: '2024-08-24'
7
+ presentation_start_time:
8
+ presentation_end_time:
9
+ version: 2024.8.24.0
10
+ licenses: []
11
+ slideshare_id: devise-two-factor-gem-4-x-5-x
12
+ speaker_deck_id: devise-two-factorwo4-dot-xkara5-dot-xnishang-getahua
13
+ vimeo_id:
14
+ youtube_id:
15
+ width: 800
16
+ height: 600
17
+ source_code_uri:
18
+ author:
19
+ markup_language: :markdown
20
+ name: Kazuhiro NISHIYAMA
21
+ email: zn@mbf.nifty.com
22
+ rubygems_user: znz
23
+ slideshare_user: znzjp
24
+ speaker_deck_user: znz
@@ -0,0 +1,101 @@
1
+ # devise-two-factorを4.xから5.xに上げた話
2
+
3
+ author
4
+ : Kazuhiro NISHIYAMA
5
+
6
+ institution
7
+ : 株式会社Ruby開発
8
+
9
+ content-source
10
+ : 大阪Ruby会議04
11
+
12
+ date
13
+ : 2024-08-24
14
+
15
+ allotted-time
16
+ : 5m
17
+
18
+ # self.introduction
19
+
20
+ - 西山 和広
21
+ - Ruby のコミッター
22
+ - github など: `@znz`
23
+ - 株式会社Ruby開発
24
+ www.ruby-dev.jp
25
+
26
+ # devise-two-factor とは?
27
+
28
+ - devise を TOTP の2要素認証に対応するのに使う gem
29
+ - ユーザごとに以下のデータを保存
30
+ - 暗号化された OTP シークレット
31
+ (認証アプリに登録するもの)
32
+ - 使用済み OTP を区別できる情報
33
+ - OTP が有効かどうか
34
+
35
+ # 4.x から 5.x への変更
36
+
37
+ - 下2個はそのままでいいが OTP シークレットの保存方法が変更
38
+ - (再掲載) ユーザーごとに以下のデータを保存
39
+ - 暗号化された OTP シークレット
40
+ - 使用済み OTP を区別できる情報
41
+ - OTP が有効かどうか
42
+
43
+ # 4.x から 5.x への変更
44
+
45
+ - 4 は attr_encrypted gem
46
+ - `encrypted_otp_secret`, `encrypted_otp_secret_iv`, `encrypted_otp_secret_salt` に Base64 でそれぞれ保存
47
+ - 5 は Rails 7+ 標準の encrypted attribute
48
+ - 暗号化したものを Base64 して JSON で `otp_secret` 1カラムに保存
49
+
50
+ # 更新手順
51
+
52
+ - 4 から 5 は Rails 6 から Rails 7 と同時に上げる必要あり
53
+ - <https://github.com/devise-two-factor/devise-two-factor/blob/main/UPGRADING.md> に手順あり
54
+ - ほとんど gem は複数の Rails に対応していて独立して更新可能
55
+ - 今回はそうなっていない
56
+
57
+ # なぜか? (推測)
58
+
59
+ - `attr_encrypted` gem と Rails 7 で `#encrypted_attributes` メソッドが衝突する
60
+ - Rails 7 対応の `attr_encrypted` に更新すると二度手間だから一気に移行する手順になっている?
61
+
62
+ # 問題点
63
+
64
+ - 実運用環境なら Rails 7 に上げた後に Rails 6 に戻す可能性もあるのでは?
65
+ - Rails 7 でユーザーの認証アプリと `otp_secret` だけが更新
66
+ → このまま Rails 6 に戻すと `encrypted_*` が古くて認証失敗
67
+ - UPGRADING.md には戻す手順はない → 独自対応が必要
68
+
69
+ # 具体的には
70
+
71
+ - UPGRADING.md に `legacy_otp_secret` の実装例
72
+ - 公式の手順途中の動作
73
+ - 読み込み
74
+ - 新カラムが設定されていれば → `otp_secret`
75
+ - なければ旧カラムを読む → `legacy_otp_secret`
76
+ - 書き込み は新しい `otp_secret` のみ
77
+
78
+ # 独自に書き込み対応
79
+
80
+ - 新しい `otp_secret` 書き込み時に`legacy_otp_secret` の逆手順で `encrypted_*` に同期
81
+ - → `legacy_otp_secret` でデコードした結果が `otp_secret` と一致するのを確認して自動テストも追加
82
+
83
+ # 手動ダウングレードテスト
84
+
85
+ - 実際に戻してみてテスト → うまく動かないので、さらに調査
86
+ - → `attr_encrypted` が `salt` に prefix として `_` をつける `encode_salt` オプションがデフォルトで `true`
87
+ - `Base64.decode64` は `_` を無視するので `legacy_otp_secret` は動く
88
+ - → 同期時に `_` を prepend して解決
89
+
90
+ # まとめ
91
+
92
+ - 非互換のダウングレード対応は新バージョンでの互換メソッドの自動テストだけでは不十分
93
+ - 手動でダウングレード確認も必須
94
+ - その他の対応も場合分けして用意
95
+ - 例: ダウングレード中に `encrypted_*` だけが更新されて `otp_secret` が古くなる → `otp_secret` を nil に戻すタスク
96
+
97
+ # 宣伝
98
+
99
+ - 福岡Rubyist会議04 <https://regional.rubykaigi.org/fukuoka04/>
100
+ - 2024.09.07 Sat. 9:30–18:00
101
+ - 主催: Fukuoka.rb / 株式会社Ruby開発
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-znz-devise-two-factor-from-4-to-5
3
+ version: !ruby/object:Gem::Version
4
+ version: 2024.8.24.0
5
+ platform: ruby
6
+ authors:
7
+ - Kazuhiro NISHIYAMA
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-08-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ description: "[大阪Ruby会議04](https://regional.rubykaigi.org/osaka04/)のスポンサーLTの発表資料です。"
28
+ email:
29
+ - zn@mbf.nifty.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".rabbit"
35
+ - README.md
36
+ - Rakefile
37
+ - config.yaml
38
+ - devise-two-factor-from-4-to-5.md
39
+ - pdf/devise-two-factor-from-4-to-5-devise-two-factor-from-4-to-5.pdf
40
+ homepage: https://slide.rabbit-shocker.org/authors/znz/devise-two-factor-from-4-to-5/
41
+ licenses: []
42
+ metadata: {}
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ requirements: []
58
+ rubygems_version: 3.5.11
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: devise-two-factorを4.xから5.xに上げた話
62
+ test_files: []