Indra
1
user-api-key/new を呼び出す際に、既に他のユーザーが使用している client_id を指定すると、フォーラムは RecordNotUnique エラーを発生させ、内部サーバーエラーとしてサイレントに失敗します。
ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_user_api_keys_on_client_id"
DETAIL: Key (client_id)=(893e0230d52455ea9b729334) already exists.
)
(eval):105:in `exec_params'
app/controllers/user_api_keys_controller.rb:66:in `create'
これは、そのクライアントIDを持つAPIキーが既に存在することをユーザーに通知する、よりサイレントではない失敗を発生させるべきかもしれません。
しかし、それは第二の質問につながりますが、User APIキーはそのように動作するはずですか?クライアントIDはすべてのユーザー間で一意であるべきですか?
「いいね!」 5
可視性のためのクイックナッジ。/logs エンドポイントでこれらのエラーが頻繁に表示されています。

「いいね!」 3
blake
(Blake Erickson)
7
ご報告ありがとうございます。調査に役立つよう、いくつか質問させてください。
ローカルでデバッグできるように、基本的な再現手順を提供していただけますか? user-api-keys のユースケースは何ですか? Discourse Hub モバイルアプリを使用していますか、それとも他のものを使用していますか?
「いいね!」 1
Indra
8
どのような再現手順をご希望か分かりませんが、このPHPコードの断片でうまく再現できます。
コード
// openssl genrsa -out keypair.pem 2048
$keypair = openssl_pkey_get_private(file_get_contents("keypair.pem"));
// 公開鍵を取得
$public = openssl_pkey_get_details($keypair)["key"];
// クエリを構築
$query = http_build_query([
"auth_redirect" => "https://localhost/redirect",
"application_name" => "Test repro",
"client_id" => "7624a5376b7f52eb403a",
"scopes" => "session_info",
"nonce" => bin2hex(random_bytes(16)),
"public_key" => $public
]);
$url = "https://forum.cfx.re/user-api-key/new?" . $query;
header("Location: " . $url);
最初の認証と繰り返し認証は最初のユーザーとして成功しますが、client_idを変更せずに別のユーザーに対して再度使用すると失敗します。

ユーザーAPIキーは、ユーザーがゲームクライアントでフォーラムアカウントを使用できるようにするために使用されます。これにより、ゲーム内から投稿できるようになります。また、フォーラムアカウントを自身のウェブサイトに認証するために使用しているユーザーも多数います。
一方、クライアントIDはゲームクライアントごとに一意であるべきです。そのため、各クライアントはアプリ画面で個別のクライアントとしてリストされます。ウェブサイトのユースケースでは、すべてのログインが個別にリストされないように、1つのクライアントIDを使用したい場合があります。
「いいね!」 3
Indra
10
これについて何かアップデートはありましたか? client_id がユーザーごとではなく、グローバルに一意であるべきなのかどうか、まだ不明確です。
「いいね!」 1
ウェブサイトに独自のユーザー認証システムがなく、複数のユーザーAPIアプリケーションを作成すべきでないユースケースでは、どのように実装すべきでしょうか?
「いいね!」 2
michaeld
(Michael - Communiteq)
13
クッキーを設定しますか?それとも、ユーザーを識別するもの(外部の当事者が複製できないように「秘密」のものも追加)をハッシュ化して決定しますか?
ユーザー認証を行うアプリケーションが複数のコンピューターで使用され、認証前にユーザーデータがない場合、それは不可能です。
michaeld
(Michael - Communiteq)
15
OPとの関連性が理解できません。OPはクライアントIDが複数のユーザーによって共有されるケースを説明していますが、あなたのケースはユーザーが複数のクライアントIDを持つケースを説明しているようです。
ユーザーが複数のクライアントを持つことができるため、これはユーザーIDではなくクライアントIDと呼ばれています!
Indra
16
OAuthのようなほとんどの標準では、クライアントIDは「アプリ識別子」として説明されており、すべてのユーザー(1人だけではない)に使用できます。たとえば、フォーラムのソーシャルログインでは常に同じクライアントIDが使用されます。
ただし、ユーザーAPIキーは主にDiscourseアプリのようなクライアント向けに設計されているように見えるため、一意になるように設計されている可能性があります。それがそうであるかどうかを知ることができれば幸いです。
上記に答えることで、user_api_keys.rbにチェックが欠けているのか、データベースに間違ったインデックスがあるのかが明確になります。現在、これらのリクエストは恐ろしい500エラーを発生させ、/logsエンドポイントに表示されます。
「いいね!」 1
Indra
17
これに関する更新はありますか?ユーザーがまだこれに遭遇しています。
「いいね!」 1
sam
(Sam Saffron)
18
エラーは改善されるべきですが、client_id は一意である必要があります。
ユーザーをそのように送信する場合、API 呼び出しで一意のIDを生成する必要があります。インデックスは正しいです。1人のユーザーがN個のクライアントIDを持つことができます。