AJAX呼び出しでAPIキーを使用する方法は?

Discourse API からグループに関する情報をプログラムで取得しようとしています。このコードは、カスタマイズダッシュボードの <head> 内に記述しています。私はフォーラムの管理者です。

動作していません。おそらく、API キーの仕組みを理解していないことが原因だと思われます。

Discourse に、特定のページをユーザーが訪れるたびに API を呼び出してグループ情報を取得させたい場合、正しい API キーの設定方法は何でしょうか?

現状のコードは以下の通りです。

ダッシュボードで「API」→「新しい API キー」に移動しました。そこで「User Level」を選択する必要があります。基本的な質問で申し訳ありませんが、ここでの「User Level」とは何を意味するのでしょうか?(API 呼び出しは、指定されたページにアクセスするたびに実行される必要があります)。

「All Users」を選択しました。その後、トークンを生成しました。

次に、カスタマイズ CSS/HTML ダッシュボードの <head> 内の適切な <script> タグの間に以下を入力しました。

var groupName = [該当するグループ名]
var token = [生成したトークン]
$.ajax({
     url: 'https://myforum.com/groups/groupName.json',
      contentType: "application/json",
      headers: {
          "Api-Key": token,
          "Api-Username": "system"
        },
        dataType: 'json',
        success: function(result){
             console.log('result = ' + result);
         }
})

コードは実行されますが、「not authorized(認証されていません)」というエラーが返ってきます(私は管理者であり、実験に使用しているグループのメンバーでもあります)。

何を修正すればよいでしょうか?

「いいね!」 1

これで、サイトを閲覧できるすべての人に「すべてのユーザー」API キーが露見してしまうことになりませんか?テーマコンポーネントからグループデータを取得するには、別のアプローチを見つける必要があると思います。

「いいね!」 5

ユーザーに提供される JSON ロードに必要なグループ情報が含まれていない場合は、シリアライザーに追加する方法を検討する必要があります。既存のテーマコンポーネントやプラグインで「add to serializer」または「addToSerializer」「add_to_serializer」を検索すると役立つかもしれません。

しかし、コードはどんな場合でも動作するべきではありませんか?API にはグループに関する情報を取得する機能があります。これがどのように機能するのか、まだ混乱しています。

特定のグループに関する情報を取得するために、API を使う通常の方法はどのようなものでしょうか?

「いいね!」 1

私が知りたい最も重要な情報は、ユーザーがそのグループのオーナーかどうかです。この情報は JSON API によって返されます。したがって、ユーザーが特定のページにアクセスした際に、API を呼び出してグループに関する情報を取得し、その基本的なレスポンスには、クライアントにログインしているユーザーがオーナーであるかどうかが含まれるようにしたいと考えています。

これは API の straightforward な実装のように思えます。しかし、この操作には API キーが必要のようですが、これまで私が使用してきた方法は機能していません。

この操作は JSON API が提供する基本的なものの一つであるため、ここで専用のプラグインやテーマコンポーネントを作成する必要はないと思います。

API キーを露呈させずに API を使用する方法(つまり、標準的またはベストプラクティスとされる方法)があるかどうか、興味があります。

編集:何らかの理由でこれが API 呼び出しに適さない場合、確かにシリアライズする必要があります。それに関する動作するコードをお持ちの方はいらっしゃいますか?add_to_serializer メソッドが存在することは理解していますが、構文がうまくいかず、このメソッドの動作する例を見つけるのに苦労しています。

「いいね!」 1

@JQ331 さん

こんにちは。

参考までに、すぐに確認しました。スタッフとしてテストフォーラムにログインし、staff グループを取得したところ、期待通りの結果が得られました。

スタッフによる staff グループの JSON オブジェクト
{
  "group": {
    "id": 3,
    "automatic": true,
    "name": "staff",
    "display_name": "staff",
    "user_count": 1,
    "mentionable_level": 0,
    "messageable_level": 0,
    "visibility_level": 1,
    "automatic_membership_email_domains": null,
    "primary_group": false,
    "title": null,
    "grant_trust_level": null,
    "incoming_email": null,
    "has_messages": false,
    "flair_url": null,
    "flair_bg_color": null,
    "flair_color": null,
    "bio_raw": null,
    "bio_cooked": null,
    "bio_excerpt": null,
    "public_admission": false,
    "public_exit": false,
    "allow_membership_requests": false,
    "full_name": null,
    "default_notification_level": 3,
    "membership_request_template": null,
    "is_group_user": true,
    "is_group_owner": true,
    "members_visibility_level": 0,
    "can_see_members": true,
    "publish_read_state": false,
    "is_group_owner_display": false,
    "mentionable": false,
    "messageable": false
  },
  "extras": {
    "visible_group_names": [
      "admins",
      "moderators",
      "staff",
      "trust_level_0",
      "trust_level_1",
      "trust_level_2",
      "trust_level_3",
      "trust_level_4"
    ]
  }
}

… また、ログアウトした状態で同じ操作を試みたところ、これも期待通りの結果が得られました。

{"errors":["リクエストされたリソースを表示する権限がありません。"],"error_type":"invalid_access"}

つまり、私の見解では、すべてが正常に動作しているということです。

参考までに、@JQ331 さん、ブラウザからログインしたユーザーとしてこの操作を行うには、API キーは不要でした。

    "is_group_owner": true,
「いいね!」 6

@neounix: ご返信ありがとうございます。無駄な探索が止まりました。以前は「不正認証」というレスポンスが返ってきた理由を、認証の問題だと考えていました。

しかし、おっしゃる通り、このアクションには API キーは不要でした。実際には、上記のコードからも明らかなように、単純なコードのミスでした(以前見落としていた部分です。AJAX の URL に変数を誤って入れていました)。

以下が動作するコードです。

var groupName = [該当のグループ名]
var token = [私が生成したトークン]
$.ajax({
     url: 'https://myforum.com/groups/' + groupName + '.json',    // 以前の誤りはここです
      contentType: "application/json",
        dataType: 'json',
        success: function(result){
             console.log('full response = ' + JSON.stringify(result));
             console.log('is group owner = ' + result.group.is_group_owner);  // これは true または null のいずれかになります
     }
})

以前「不正認証」のレスポンスが返ってきたのは、入力していた URL にグループ名が誤っていたためです(“groupName” という文字列そのものとして読み込まれていました)。

「いいね!」 2