こんにちは!Discourse API の利用が本当に楽しいです!
Discourse API のリバースエンジニアリングに関するガイド に従って進めていますが、ログインリンクの送信で問題にぶつかりました。
これを行っている背景
地元のハッカースペース向けに SSO サービスを作成し、ユーザーがハッカースペースのメンバーシップシステムを使って Discourse にログインできるようにしました。
ただし、メンバーシップシステムと Discourse で異なるメールアドレスを使用しているユーザーもいるかもしれません。SSO を有効にするとローカルログインが無効化されるため、「ログインリンクをメールで送信」をクリックしてログインし、その後必要に応じてメールアドレスを更新できるようにしたいと考えています(あるいはログインリンクを使い続けることも可能です)。
目的
API を通じて user@domain.co.uk というユーザーにログインリンクを送信したいです。
以下のように試しました:
curl -X POST "https://discourse.<site>.org.uk/u/email-login" --data "{\"login\":\"user\"%\"40domain.co.uk\"}" -H "Api-Key: xxxxx" -H "Api-Username: system" -H "Content-Type: application/json"
返ってきた結果は以下の通りです:
<html><body>You are being <a href="https://discourse.<site>.org.uk/">redirected</a>.</body></html>
API キーを含めない場合は [BAD CSRF] が返されます。
つまり、ここで詰まっているのは、API を通じて Discourse に user@domain.co.uk へログインリンクをメール送信させる方法がわからないということです。
ご協力いただければ幸いです。引き続き試行錯誤して、うまくいく方法を探ります。
追伸:以下のようなハックは避けたいと考えています:
/session/csrf にリクエストを送り、CSRF トークンを保存する
その CSRF トークンを使って /u/email-login にリクエストを送る
API キーだけでこれを達成することは可能でしょうか?
よろしくお願いいたします!
フォローアップとなりますが、CSRF ルートを介してからメールリンクルートを使用する方法が正しい手順でしょうか?
API キーを提供した場合、API 側でこの機能の実装は存在しないのでしょうか?
david
(David Taylor)
2021 年 7 月 27 日午後 2:10
3
SSO サービスは Discourse とどのように連携しますか?DiscourseConnect を使用している場合、/u/email-login エンドポイントは無効になっていると思います。
返信ありがとうございます。はい、Discourse Connect を使用しています。
私も同じように考えていたため、Discourse Connect を無効化してログインリンクの送信を試みましたが、うまくいかず、それが上記の投稿で出力された結果となりました。
Discourse Connect が有効な状態でメールリンクの取得が無効になっている場合、メンバーシップシステムの SSO サービスから Discourse へアカウントを連携させる方法を再考する必要があります。
david
(David Taylor)
2021 年 7 月 27 日午後 2:43
5
おっしゃる通り、最も簡単な方法はメールアドレスでアカウントを一致させることです。それが不可能な場合、私たちが採用しているいくつかのアプローチがあります。
他の一意の識別子を使用してユーザーを一致させます。コンソールからユーザーの DiscourseConnect 関連付けを事前に作成できます。これは、Discourse と ID プロバイダー間で一貫性のある他の識別子が存在する場合にのみ機能します。
(最も一般的)ユーザーに新規アカウントの登録を許可し、その後、管理者にメッセージを送信して、新しいアカウントを古いアカウントに「マージ」してもらうように依頼します(ユーザー管理ページ下部のボタンを使用)。これにより、自動的にメールアドレスが一致し、DiscourseConnect 関連付けが作成されます。
ご返信ありがとうございます。
アカウントの統合というアプローチが、私が選択する方向性だと思われます。
このプロセスをユーザー自身で完結できる機能があれば素晴らしいでしょう。例えば、メールリンクを通じてユーザーがログインし、そこでメールアドレスを更新して二つのアカウントを同期させるような API を用意する方法や、ユーザーが自身の Discourse のメールアドレスとパスワード、そして新しいメールアドレスを入力することで本人確認を行う方法などが考えられます。
お時間をいただき、改めてありがとうございます。