커스텀 Ruby 파일로 비밀번호 재설정

Discourse에서 비밀번호를 업데이트하기 위한 사용자 정의 함수

이 코드를 사용하여 비밀번호를 업데이트할 수 있을까요?

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

또는

사용자 정의 플러그인을 생성하여 API와 같은 사용자 정의 엔드포인트를 사용하고, 사용자 자격 증명으로 토큰을 생성한 후 API로 비밀번호를 재설정하는 방법도 있을까요?

이 작업을 수행하는 가장 좋은 방법을 공유해 주세요

히테시님, 안녕하세요.

사용 사례가 어떻게 되나요? 내장 기능을 사용하지 않는 이유는 무엇인가요?

답변해 주셔서 감사합니다.

현재 저는 Drupal 사용자를 Discourse로 이주하는 커스텀 스크립트를 사용 중입니다. 하지만 비밀번호가 해시 문자열로 저장되어 있어서, admin@123과 같은 신뢰할 수 있는 비밀번호로는 로그인할 수 없습니다.

대신 비밀번호 해시 값으로 로그인해야 합니다.
예: 3sdfd32423@#423fdsfr

따라서 내장 기능에 대해 간단히 설명해 주실 수 있을까요?

이 내용을 확인해 보셨나요? 도움이 될 수 있습니다:

Drupal 7 비밀번호를 지원합니다:

안녕하세요 @Canapin

또한, 이 플러그인을 사용했는데 작동하지 않습니다

아니요 - 작동하고 있습니다.

이것은 가장 오래된 서드파티 플러그인 중 하나입니다(지금까지 9년 이상!) 그리고 항상 유지보수되며 정상적으로 작동해 왔습니다. 당신에게는 작동하지 않을 수 있지만, 이를 해결하는 방법은 대체 경로를 시도하는 것이 아니라 왜 당신에게 작동하지 않는지 이유를 찾는 것입니다.

이 부분을 다시 표현해 주실 수 있을까요? 말씀하시는 내용을 이해하지 못하겠습니다.

제 Drupal 웹사이트가 사용자 비밀번호를 암호화된 코드로 저장하고 데이터베이스에 보관하고 있는지 궁금합니다. 저는 dsiscourse API를 사용하여 모든 사용자를 Discourse라는 플랫폼으로 이전했습니다. Drupal 데이터베이스에서 사용자 정보와 비밀번호 코드를 가져와 페이로드를 생성한 뒤 Discourse에 넣었습니다.

사용자들이 Drupal과 동일한 로그인 정보를 Discourse에서도 사용할 수 있을 것이라고 생각했지만, 작동하지 않습니다. Discourse는 "admin@123"과 같은 사용자의 실제 비밀번호를 받지 않습니다. 대신 "3sdfd32423@#423fdsfr"과 같은 사용자 비밀번호 해시 코드를 사용합니다.

Discourse는 Drupal에서 가져온 비밀번호 코드를 자체 데이터베이스의 자체 암호화 알고리즘에 맞게 변환하여 저장합니다.

어떻게 진행했는지 보여줄 수 있을까요?
API를 사용하셨다면, Drupal 해시를 비밀번호로 설정해서는 안 됩니다. import_pass라는 이름의 사용자 정의 필드로 해시를 설정해야 합니다. API를 통해 이것이 가능한지 확신은 없습니다.

Discourse Migrate 플러그인을 설치하면서 안내하신 단계를 따랐습니다.

→ 먼저 플러그인을 Discourse에 설치했지만 활성화하지 않고, import_pass라는 이름의 사용자 정의 필드를 Discourse에 생성했습니다.

→ 페이로드에 이 사용자 정의 필드에 저장된 비밀번호 해시를 추가했습니다.

→ 사용자가 Discourse로 업로드된 후 플러그인을 활성화하고 새 창에서 사용자 자격 증명으로 로그인했지만 로그인되지 않았습니다.

이것은 명시적으로 포함되지 않는 단계입니다.

그 이름의 사용자 필드를 생성하는 것과 그 이름의 사용자 정의 필드를 가진 것에는 차이가 있습니다. 따라서 해시가 잘못된 위치에 저장되고 있습니다.

문제는 후자(사용자 정의 필드)가 API를 통해 접근할 수 없다고 생각하는 것입니다.
가장 좋은 해결책은 사용자 필드의 내용을 실제 사용자 정의 필드로 이동시키는 일회성 커스텀 코드를 실행하는 것이라 생각합니다.

(플러그인을 수정하여 사용자 필드도 확인하도록 하는 것을 고려해 보았지만, 이러한 해시를 사용자 인터페이스에 노출하는 것은 보안 위험이라고 생각하므로 그렇게 하지 않겠습니다).

이것은 작동할 것입니다. Rails 콘솔에서 실행하세요 (수정을 확인하실 수 있도록 @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