カスタムRubyファイルでパスワードをリセット

Discourse でのパスワード更新用のカスタム関数

このコードを使用してパスワードを更新できますか?

例:-
User.find_by(username: ‘gollum’).update!(password: ‘shiiiire!-BAGGINS!’)

または

カスタムプラグインを作成し、APIのようなカスタムエンドポイントを使用できますか?
ユーザー認証情報でトークンを作成してから、APIでパスワードをリセットします。

このタスクを実行するための最良の方法を教えてください。

Hiteshさん、こんにちは。

どのようなユースケースでしょうか? なぜ組み込み機能を使用しないのですか?

「いいね!」 1

返信ありがとうございます。

DrupalユーザーをDiscourseに移行するためにカスタムスクリプトを使用していますが、パスワードはハッシュ文字列として保存されており、ユーザーは(admin@123)のような信頼できるパスワードでログインできません。

しかし、パスワードハッシュでログインできます。
例:3sdfd32423@#423fdsfr

組み込み機能について少し説明していただけますか?

これを見てみましたか? 役に立つかもしれません。

Drupal 7 のパスワードに対応しています。

「いいね!」 1

こんにちは、@Canapinさん

また、このプラグインを使用しましたが、動作しません。

いいえ、機能しています。

これは(現在9年以上前の)最も古いサードパーティプラグインの1つであり、常にメンテナンスされ、機能してきました。あなたにとっては機能していないかもしれませんが、その解決策は、代替ルートを試すのではなく、なぜあなたにとって機能していないのかを見つけることです。

これはどういう意味か分かりかねますので、言い換えていただけますでしょうか。

私のDrupalウェブサイトは、ユーザーパスワードを暗号化されたコードで保存し、データベースに保持していますか?すべてのユーザーをDiscourseというプラットフォームにdsiscourse APIを使用して移行しました。Drupalのデータベースからユーザーの詳細とパスワードコードを使用してペイロードを作成し、Discourseに入力しました。

ユーザーはDrupalと同じログイン情報を使用できると思っていましたが、機能しません。Discourseは、「admin@123」のようなユーザーの実際のパスワードを受け入れません。代わりに、「3sdfd32423@#423fdsfr」のようなユーザーパスワードハッシュコードを使用します。

DiscourseはDrupalからパスワードコードを取得し、独自のデータベースで独自の暗号化アルゴリズムに格納します。

どのように行ったか教えていただけますか?
APIを使用していた場合、Drupalのハッシュをパスワードとして設定するべきではありません。代わりに、import_passというカスタムユーザーフィールドにハッシュを設定する必要があります。APIを使用してそれが可能かどうかはわかりません。

「いいね!」 1

Discourse Migrate プラグインをインストールする際に、以下の手順に従いました。

  • まず、プラグインを Discourse にインストールしましたが、有効化しませんでした。その後、import_pass という名前のカスタムフィールドを Discourse に作成しました。

  • ペイロードに、このカスタムフィールドに保存されているパスワードハッシュを追加しました。

  • ユーザーが Discourse にアップロードした後、プラグインを有効化し、新しいウィンドウでユーザー資格情報でログインしましたが、ログインできませんでした。

これは明示的に 手順の一部ではありません。

その名前のユーザーフィールドを作成することと、その名前のカスタムフィールドを持つことには違いがあります。そのため、ハッシュは間違った場所に保存されています。

問題は、後者(カスタムフィールド)はAPIを使用してアクセスできないと思うことです。

最も良い解決策は、ユーザーフィールドの内容を実際のカスタムフィールドに移動する、カスタムの使い捨てコードを用意することだと思います。

(プラグインを変更してユーザーフィールドも確認するようにすることも検討しましたが、UIにこれらのハッシュを表示することはセキュリティリスクがあると思うので、それはしません。)

これは機能します。レールコンソールから実行してください(編集に気づくようにタグ付けします @Hitesh_Sharma)。

ufkey = "user_field_#{UserField.find_by(name: 'import_pass').id}"
User.all.each do |u|
  if u.custom_fields.key?(ufkey)
    u.custom_fields[:import_pass] = u.custom_fields[ufkey]
    u.custom_fields.delete(ufkey)
    u.save_custom_fields
  end
end
「いいね!」 2