ECCubeのシステム入れ替え時に、パスワードをそのまま移行する方法(ECCubeからRailsへのリニューアル)
目次
プロジェクトの全体内容
すでに会員向けのサイトでECCubeが稼働している際に、ECCubeから脱却して新しいシステムにフルリニューアルするプロジェクトがありました。
DBの移行も含まれており、ECCubeで保存していたユーザー情報やその他の情報なども移行することにしました。
既存のECCubeにはログイン機能で、メールアドレス、パスワードの入力でユーザー認証を行うことができログインすることができます。
新システムに移行した際に、ユーザーのメールアドレス、パスワードは変更せず、既存のECCubeと同じメールアドレス、パスワードでログインが可能なようにしました。
各種バージョン
ECCube:3.0.7
Rails:7.0.5.1
ECCubeでのパスワードの認証方式
まずは既存のECCubeでどのように認証がなされているか確認しました。
パスワードの暗号化のアルゴリズムの方式は、/app/config/eccube/config.yml
のファイルの中で確認することができます。
auth_magic: ~~~
password_hash_algos: sha256
shop_name: ~~~
force_ssl: 1
admin_allow_host: null
cookie_lifetime: 0
locale: ja
timezone: Asia/Tokyo
eccube_install: 1
password_hash_algos の項目を見ると、sha256 となっていました。
また、実際にパスワードの暗号化がなされている実際のコードを確認しました。
ECCubeのGitHubのソースコードで確認しました。(ECCubeのv4系の場合は /app/config/eccube/packages/security.yaml で確認できるようです。ただし、今回はECCubeのv3系だったので場所がわからなかったため、v4系のコードからv3系の認証方式が読み解けないか確認しました。)
確認するとユーザーのパスワードの認証の実際のコードが書かれているのは、/src/Eccube\Security\Core\Encoder\PasswordEncoder にあるということがわかりました。
このファイルをすべて説明することはしませんが、上記のファイル内でどのように暗号化がなされているのか確認してみると、以下のようにパスワードが暗号化なされることがわかりました。
salt = ユーザーごとに都度ランダムに作成される文字列
A = "<ユーザーに入力されたパスワード>" + ":" + "<ECCubeのconfigで設定されているauth_magic>"
この2つのsaltとAの値をHMACのsha256で暗号化して、それを暗号化パスワードとしてデータベースに保存する。
というロジックになっています。
また、ここで出てきたそれぞれの値は、以下の箇所に設定や保存がなされています。
- saltはDBのユーザー情報のsaltカラム
- 暗号化されたパスワードはDBのユーザー情報のpasswordカラム
- auth_magicは
/app/config/eccube/config.yml
のファイルのauth_magicで設定されている値
上記をもとに、新システムでパスワード暗号化を再現し、auth_magicとsaltを移行すれば、ユーザーにパスワードを再設定させなくても、これまでと同じメールアドレス・パスワードでログインすることが可能になります。
Railsでのパスワード暗号化の再現方法
今回はdeviseを用いてユーザー管理を行うことにしました。
deviseのパスワード暗号化の方式を変更するために以下の手順を踏みました。
- `gem “devise-encryptable”` の導入
- ユーザーテーブルに`password_salt`というカラムを追加
- `config/initialize/sha256.rb`で、ECCubeの認証で使われていたSHA256での暗号化アルゴリズムを再現する
- devise.rbの暗号化の箇所をコメントアウトを変更して、暗号化方式をsha256を設定する
- 既存のユーザー情報であるメールアドレスとパスワードとsaltの値を新しい新システムのユーザーテーブルに移行する
上記の設定でdeviseの認証方式を変更することができ、新システムになった際にも既存のユーザーはパスワードの再設定をしなくてもログインすることができます。