この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Auth0に認証を移行しようとした場合、 既存のデータベースやサービスからユーザーの認証情報をAuth0に移行する必要があります。 Auth0ではユーザーの移行に
があります。
今回はcreate import users APIを使用する一括インポートを試したいと思います。
事前準備
移行元のデータを作成
すでに稼働しているシステムでは不要ですが、今回はサンプルデータを用意して試します。
テーブルはこんなのを用意.
CREATE TABLE users (
id int(10) unsigned not null auto_increment,
name varchar(255) not null,
email varchar(255) not null,
hash varchar(255) not null,
created_time datetime not null default current_timestamp,
updated_time datetime not null default current_timestamp on update current_timestamp,
primary key (id)
);
データとして以下を用意。ハッシュアルゴリズムはSHA256を使用しました。
insert into users(name, email, hash)
values
("sample_user_1","sample1@classmethod.net","BEB47E1B660CD2B55FED9DCCB4FC572A250E165F219926B11D6D6D4DA40BCEAF"),
("sample_user_2","sample2@classmethod.net","AAE0C7FADCA1BDDBE92C3BC0B85B9777625B6BA17E7072D41FAF526C65CB76C9"),
("sample_user_3","sample3@classmethod.net","D892F917156C6CFE42B4D8003B0B15EBC160C0619CAB4F4C2B9DD3968EDED0CC")
;
やってみる
Auth0にインポート用のデータベース接続とアプリケーションを用意する
パスワード認証用のデータベースと、それを使ってログインするアプリケーションを作成する必要があります。
Auth0ダッシュボード -> Connections -> Database
のページからコネクションを作成します。
Applicationも同様に、 Auth0ダッシュボード -> Applications
のページから作成します。
Applicationの作成後、設定画面のConnections
タブをクリックし、接続したいConnectionのトグルをONにします。
Auth0にインポートするためのファイルを用意する
Auth0にインポートするユーザーデータを含むJSONファイルを作成する必要があります。
インポート元のデータの name
, email
, hash
をAuth0にインポートしたいので、
{
"name": "sample_user_1",
"email": "sample1@classmethod.net",
"email_verified": true,
"custom_password_hash": {
"algorithm": "sha256",
"hash": {
"value": "BEB47E1B660CD2B55FED9DCCB4FC572A250E165F219926B11D6D6D4DA40BCEAF",
"encoding": "hex"
}
}
},
{
.........................略
}
といったjsonデータを用意します。
custom_password_hash
のオブジェクトですが、
サンプルのインポート元のDBにsha256のデータを格納しているので、
- algorithm:
sha256
- hash.encoding:
hex
またはbase64
でなければいけません。
インポートジョブAPIを実行する
curlを使ってAPIを実行してみます。
curl --request POST \
> --url 'https://< YOUR_DOMAIN >/api/v2/jobs/users-imports' \
> --header "authorization: Bearer < MGMT_API_ACCESS_TOKEN >" \
> --form "users=@<USERS_IMPORT_FILE.json>" \
> --form "connection_id=< CONNECTION_ID >" \
> --form "external_id=< EXTERNAL_ID >" \
> --form "upsert=false" \
> --form "send_completion_email=false"
params | |
---|---|
users | インポートするユーザーの情報が入ったjsonファイルを指定します |
connection_id | ユーザーがインポートされるconnectionのID |
external_id | 複数のジョブを関連付けるために使用できるオプションのユーザー定義の文字列 |
upsert | false : メールアドレス、ユーザーID、またはユーザー名が一致する既存のユーザーは失敗します。 true : これらのフィールドのいずれかに一致する既存のユーザーが更新されますが、更新可能な属性のみが含まれます |
send_completion_email | true : インポートジョブが完了したときに、完了メールをすべてのテナント所有者に送信します。 false :送信しない |
実行後、リクエスト成功で以下のような内容が返却されます。
{
"type":"users_import",
"status":"pending",
"connection_id":"con_3F66IUAL2pCWxqVa",
"external_id":"sample_user_import_1",
"connection":"misc-study-archives",
"created_at":"2020-07-07T06:56:05.308Z",
"id":"job_SbmUbuE4i82PxR4P"
}
インポートジョブのステータスを確認するには、以下のコマンドを実行します。 JOB_IDにリクエスト送信で返ってきた値を指定します。
curl --request GET \
--url 'https://< YOUR_DOMAIN >/api/v2/jobs/< JOB_ID >' \
--header 'authorization: Bearer < MGMT_API_ACCESS_TOKEN >' \
--header 'content-type: application/json'
結果は、
{
"type":"users_import",
"status":"completed",
"connection_id":"con_3F66IUAL2pCWxqVa",
"external_id":"sample_user_import_1",
"summary":{"failed":0,"updated":0,"inserted":1,"total":1},
"connection":"misc-study-archives",
"created_at":"2020-07-07T06:56:05.308Z",
"id":"job_SbmUbuE4i82PxR4P"
}
status
は現在のjobの状態で, ["pending", "processing", "completed", "failed"]
があります。
summary
にインポートできたユーザー数や失敗したユーザー数、更新したユーザー数が出力されます。
この例ではcompleted
となっていますので、Auth0ダッシュボードでもユーザーが追加されているか確認してみます。
jsonに記述した名前、メールアドレス、インポートジョブで指定したconnectionにユーザーが登録されていますね。
ログイン確認
ユーザー登録はされたので、実際にログインできるか確認してみましょう。 移行前のパスワードと同じものでログインできるはずです。
おまけ
同じDBに違うハッシュアルゴリズムを使ったユーザーをインポートできるのか?
本記事ではsha256でハッシュ化されたパスワードをインポートしましたが、そこに別のハッシュアルゴリズムを使ったパスワードをインポートできるか気になったのでやってみます(bcryptを使用)。
以下のクエリでテーブルにデータを突っ込みました。
insert into users(name, email, hash)
values
("sample_user_4","sample4@classmethod.net","$2a$08$rSClFWZCKQn/c9.Xv8f0zOxgg.Hap2NsBlY7vEocKh6mHvklt1l8m")
;
usersに設定するjsonふぁいるは
{
"name": "sample_user_4",
"email": "sample4@classmethod.net",
"email_verified": true,
"custom_password_hash": {
"algorithm": "bcrypt",
"hash": {
"value": "$2a$08$rSClFWZCKQn/c9.Xv8f0zOxgg.Hap2NsBlY7vEocKh6mHvklt1l8m",
"encoding": "utf8"
}
}
}
algorithm
にbcrypt
を指定します。
注意点として、hash.value
には$2a$
か$2b$
を前につける必要があります。
$2$
, $sha1$
, $2x$
のバージョンはサポートされていませんでした。
ファイルを作成後、先ほどと同じインポートジョブを実行してみます。
結果、
{
"type":"users_import",
"status":"pending",
"connection_id":"con_3F66IUAL2pCWxqVa",
"external_id":"sample_user_import_1",
"connection":"misc-study-archives",
"created_at":"2020-07-07T07:45:01.382Z",
"id":"job_q1QHat2BnTR1G9O5"
}
のようにリクエストが受け付けられました。
ステータスを確認してみると、completed
で成功していました。
{
"type":"users_import",
"status":"completed",
"connection_id":"con_3F66IUAL2pCWxqVa",
"external_id":"sample_user_import_1",
"summary":{"failed":0,"updated":0,"inserted":1,"total":1},
"connection":"misc-study-archives",
"created_at":"2020-07-07T07:45:01.382Z",
"id":"job_q1QHat2BnTR1G9O5"}
もちろんダッシュボード上からもユーザーの確認ができました。
ログインも可能です。
ということで同じデータベースに対して別々のハッシュアルゴリズムを使ったパスワードもインポートできて、ログインもできるということがわかりました。 チャンチャン