JQ331
2020 年 6 月 8 日午後 10:45
1
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
simon
2020 年 6 月 8 日午後 11:50
2
これで、サイトを閲覧できるすべての人に「すべてのユーザー」API キーが露見してしまうことになりませんか?テーマコンポーネントからグループデータを取得するには、別のアプローチを見つける必要があると思います。
「いいね!」 5
pfaffman
(Jay Pfaffman)
2020 年 6 月 8 日午後 11:53
3
ユーザーに提供される JSON ロードに必要なグループ情報が含まれていない場合は、シリアライザーに追加する方法を検討する必要があります。既存のテーマコンポーネントやプラグインで「add to serializer」または「addToSerializer」「add_to_serializer」を検索すると役立つかもしれません。
JQ331
2020 年 6 月 9 日午前 12:03
4
しかし、コードはどんな場合でも動作するべきではありませんか?API にはグループに関する情報を取得する機能があります。これがどのように機能するのか、まだ混乱しています。
特定のグループに関する情報を取得するために、API を使う通常の方法はどのようなものでしょうか?
「いいね!」 1
JQ331
2020 年 6 月 9 日午前 1:36
5
私が知りたい最も重要な情報は、ユーザーがそのグループのオーナーかどうかです。この情報は JSON API によって返されます。したがって、ユーザーが特定のページにアクセスした際に、API を呼び出してグループに関する情報を取得し、その基本的なレスポンスには、クライアントにログインしているユーザーがオーナーであるかどうかが含まれるようにしたいと考えています。
これは API の straightforward な実装のように思えます。しかし、この操作には API キーが必要のようですが、これまで私が使用してきた方法は機能していません。
この操作は JSON API が提供する基本的なものの一つであるため、ここで専用のプラグインやテーマコンポーネントを作成する必要はないと思います。
API キーを露呈させずに API を使用する方法(つまり、標準的またはベストプラクティスとされる方法)があるかどうか、興味があります。
編集:何らかの理由でこれが API 呼び出しに適さない場合、確かにシリアライズする必要があります。それに関する動作するコードをお持ちの方はいらっしゃいますか?add_to_serializer メソッドが存在することは理解していますが、構文がうまくいかず、このメソッドの動作する例を見つけるのに苦労しています。
「いいね!」 1
neounix
(Dark Matter)
2020 年 6 月 9 日午前 4:09
6
@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
JQ331
2020 年 6 月 9 日午後 12:52
7
@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