UserエンティティのCreateUserアクションでパスワードを設定する

OutSystemsで自前のActionでユーザを作成したときに、作成したユーザでログインできない場合の対処法です。

公式情報

GenerateSaltedMD5Hash Action (Deprecated)

GenerateSaltedSHA512Hash Action

現象

自作のAction中でUserエンティティをScreen Action中から作成しました。

動作確認のため、いったんAssignの中で、「password」を設定していました。

WS000002

該当部分のScreen Actionはこんな感じ。

WS000001

Excelでアップロードしたレコードをループして、それぞれ

  1. Userレコードを準備(Assign)
  2. UserレコードをDBに追加(CreateUser:デフォルトのUserエンティティが持っている1行追加のAction)
  3. 作ったレコードをアプリケーションのロールに設定(ロールのGrantアクション)

これで作成したユーザ(UserNameは渡した値、Passwordは「password」)でログインしてみたところ、「Invalid Login」となりました。

InvalidLogin

原因

Usersアプリケーションで確認してみたら確かにユーザが作成されていました。

さらにパスワードを同じ値(password)として変更してみるとログインできるようになる。

Users画面(Userの一覧表示画面)を作成して確認してみると、自分で作ったユーザには生の「password」が表示されているにもかかわらず、ほかのユーザは「9731……」のような値になっていました。

つまりセキュリティのため、何らかのエスケープ的処理が入っているということですね。

対策

Usersアプリからユーザを作ると正しくパスワードが設定されている以上、何らかの関数などがあるはず。

と思って探したら見つかりました。上の公式情報に記載した2つのアクションです。

今回は固定値なので、ループに入る直前で上記アクションを読んでパスワード文字列を用意しておきます。

GenerateSaltedMD5Hashは、Dependenies→PlatformPasswordUtilsの下にあります。

配置したら、生パスワードをパラメータとして設定。

WS000005

生成したパスワード(ハッシュ値)は、配置したアクション経由でUserレコードに設定してやります。

WS000003

Userを作り直したら無事にログインできました。

備考

GenerateSaltedMD5HashのヘルプによるとDeprecatedらしいので今から作るなら、GenerateSaltedSHA512Hashの方を使うべきですね。

私の開発環境ではデフォルトでは出てこなかったので、Logicレイヤ→Dependencies→PlatformPasswordUtilsを右クリックしてアクションを追加しました。

WS000004

実際に試してみたところ、現時点では、どっちでハッシュ化したパスワードがDBに保存されていても問題なくログインできました。