API キーを使用すると、Discourse を他のシステムと統合したり、さまざまな動作を自動化したりできます。ただし、大きな力には大きな責任が伴います。悪意のあるアクターが API キーにアクセスできた場合、機密データにアクセスしたり、サイトに変更を加えたりする可能性があります。これを緩和し、セキュリティの追加レイヤーを提供するため、スコープを使用して API キーが実行できる動作を制限できるようになりました。
スコープと許可されるパラメータ
新しい API キーを作成する際、使用するスコープを選択できます。 アイコンの上にマウスを合わせると、その動作に関する簡単な説明が表示されます。 ボタンをクリックすると、そのスコープに関連付けられた URL が表示されます。
任意で、受け入れられるパラメータを指定することもできます。複数の値はカンマで区切ってください。
既存のキーの移行
この機能追加時に、既存のキーは「グローバル」キーとして扱われました。スコープ付きのキーに移行するには、既存のキーを無効化し、新しいキーを作成する必要があります。
カスタムスコープの追加
プラグインは add_api_key_scope メソッドを呼び出すことで、カスタムスコープを追加できます。
reloadable_patch { Reviewable.add_custom_filter(filter) }
end
# Register a new API key scope.
#
# Example:
# add_api_key_scope(:groups, { delete: { actions: %w[groups#add_members], params: %i[id] } })
#
# This scope lets you add members to a group. Additionally, you can specify which group ids are allowed.
# The delete action is added to the groups resource.
def add_api_key_scope(resource, action)
DiscoursePluginRegistry.register_api_key_scope_mapping({ resource => action }, self)
end
# Register a new UserApiKey scope, and its allowed routes. Scope will be prefixed
# with the (parameterized) plugin name followed by a colon.
#
# For example, if discourse-awesome-plugin registered this:
#
# add_user_api_key_scope(:read_my_route,
# methods: :get,
resource は関連するスコープをグループ化するために使用されるシンボルです。一方、action は以下の属性を持つハッシュです。
actions : 許可されるコントローラーアクションのリスト。形式は controller_name#method_name です。
methods : 許可する HTTP メソッドのリスト(例: %i[get])。コントローラーアクションではなく HTTP メソッドで一致させる場合は、actions の代わりにこれを使用してください。
params : 許可されるパラメータ名のリスト。
aliases : 許可されるパラメータの別の名前を含むハッシュ。
基本スコープの定義方法を知りたい場合は、以下のリンクを参照してください。
class << self
def list_actions
actions = %w[list#category_feed list#category_default list#latest_feed]
%i[latest unread new top].each { |f| actions.concat(["list#category_#{f}", "list##{f}"]) }
actions
end
def default_mappings
return @default_mappings unless @default_mappings.nil?
mappings = {
global: {
read: {
methods: %i[get],
},
},
topics: {
write: {
「いいね!」 24
カテゴリの取得で読み取り専用 API キーを使用すると 403 レスポンスが返されるようです。
curl -X GET "https://mysite/categories.json" \
-H "Api-Key: mykey" \
-H "Api-Username: system"
この API キーにはトピックの「read」と「read_list」権限が付与されています。例えば、同じキーで /top.json は動作します。また、‘Global Key’ を使用するとこのエンドポイントは正常に動作します。
カテゴリとトピックのリストを読み取るために、API キーをクライアントに格納したいと考えています。そのため、読み取り専用のキーを使用することが重要です!
何かヒントはありませんか?
「いいね!」 1
興味深いことに、認証情報を一切使用しない場合は動作します!
k
つまり、curl -X GET "https://mysite/categories.json" のように実行します。
「いいね!」 1
Roman
(Roman Rizzi)
2020 年 9 月 23 日午後 2:32
5
残念ながら、利用可能なエンドポイントが非常に多いため、デフォルトではほんのいくつかのスコープのみを含めています。将来的に新しいスコープを追加する可能性もありますが、それまでの間は、ご自身のニーズに合わせて拡張する必要があります。
スコープ付きの API キーを使用する場合、選択したスコープに含まれていないエンドポイントを呼び出すと動作しません。受け入れられる URL を確認するには、 ボタンをクリックしてください。
これは公開サイトのみに有効です。また、ログインしておらず、十分な権限を持っていない限り、プライベートカテゴリなどの情報は表示されません。
「いいね!」 6
Dannii
(Dannii)
2020 年 9 月 26 日午前 7:53
6
さらなるスコープの提案を受け付けていますか?
当サイトのAPIを利用して、他サイトがメールアドレスからユーザーの存在を確認し、該当する場合はグループに追加したいと考えています。信頼できるサイト(親組織内の他サイト)ですが、必要なアクセス権限のみを付与するように制限できるのであれば、それが賢明な選択肢だと考えます。
「いいね!」 1
fzngagan
(Faizaan Gagan)
2020 年 9 月 26 日午前 8:35
7
プラグイン用のAPIが公開されたことをとても嬉しく思います。まずはプラグインから始め、それがコアに組み込めるかどうかを確認してみましょう。
「いいね!」 2
riking
(Kane York)
2020 年 9 月 26 日午前 10:17
8
一般的に有用なスコープであれば、PR を歓迎します。例えば group_membership.edit はどうでしょうか?
「いいね!」 5