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

Sign up to get free protection for your applications and to get access to all the features.
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: []