# Где мне хранить API-ключи Discourse, чтобы получать посты?

**URL:** https://meta.discourse.org/t/where-should-i-put-the-api-keys-of-discourse-so-that-i-can-fetch-the-posts/224177
**Category:** Development
**Tags:** rest-api
**Created:** [13.Апрель.2022 15:08:27 UTC](https://meta.discourse.org/t/where-should-i-put-the-api-keys-of-discourse-so-that-i-can-fetch-the-posts/224177 "2022-04-13T15:08:27Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![Allen\_Chen](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/allen_chen/32/256627_2.png) [@Allen\_Chen](https://meta.discourse.org/u/Allen_Chen)
#### Post date: [13.Апрель.2022 15:08:27 UTC](https://meta.discourse.org/t/where-should-i-put-the-api-keys-of-discourse-so-that-i-can-fetch-the-posts/224177/1 "2022-04-13T15:08:27Z")

</div>

Я пытаюсь получить посты с моего Discourse, но не знаю, куда вставлять API-ключи. Я делаю запрос к адресу: https://{defaultHost}/posts/{id}.json, но получаю ошибку, так как ещё не ввёл API-ключи. Где именно нужно их указать?

---

<div class="post-metadata">

### Author: ![blake](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/blake/32/157322_2.png) [@blake](https://meta.discourse.org/u/blake)
#### Post date: [13.Апрель.2022 15:12:16 UTC](https://meta.discourse.org/t/where-should-i-put-the-api-keys-of-discourse-so-that-i-can-fetch-the-posts/224177/2 "2022-04-13T15:12:16Z")

</div>

Не уверен, как именно вы отправляете запросы к API (какой инструмент или язык программирования используете), но ключ API и имя пользователя указываются в заголовке HTTP.

Вот пример с использованием curl из документации: [Discourse REST API Documentation](https://meta.discourse.org/t/discourse-api-documentation/22706)

```plaintext
curl -X POST "http://127.0.0.1:3000/categories" \
-H "Content-Type: multipart/form-data;" \
-H "Api-Key: 714552c6148e1617aeab526d0606184b94a80ec048fc09894ff1a72b740c5f19" \
-H "Api-Username: discourse1" \
-F "name=89853c20-4409-e91a-a8ea-f6cdff96aaaa" \
-F "color=49d9e9" \
-F "text_color=f0fcfd"

```

---

<div class="post-metadata">

### Author: ![Allen\_Chen](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/allen_chen/32/256627_2.png) [@Allen\_Chen](https://meta.discourse.org/u/Allen_Chen)
#### Post date: [13.Апрель.2022 15:16:45 UTC](https://meta.discourse.org/t/where-should-i-put-the-api-keys-of-discourse-so-that-i-can-fetch-the-posts/224177/4 "2022-04-13T15:16:45Z")

</div>

Я делаю это в Next.js. Где мне разместить этот код?

---

<div class="post-metadata">

### Author: ![blake](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/blake/32/157322_2.png) [@blake](https://meta.discourse.org/u/blake)
#### Post date: [13.Апрель.2022 15:30:34 UTC](https://meta.discourse.org/t/where-should-i-put-the-api-keys-of-discourse-so-that-i-can-fetch-the-posts/224177/5 "2022-04-13T15:30:34Z")

</div>

> [@Allen\_Chen](#):
>
> Я делаю это на Next.js

Я не очень хорошо знаком с Next.js, поэтому не могу сказать наверняка, но, похоже, Next.js использует инструмент под названием SWR для выполнения API-запросов.

> **[Data Fetching: Client-side Fetching | Next.js](https://nextjs.org/docs/pages/building-your-application/data-fetching/client-side)**
>
> Learn about client-side data fetching, and how to use SWR, a data fetching React Hook library that handles caching, revalidation, focus tracking, refetching on interval and more.

Вам нужно быть _ **ОЧЕНЬ** _ осторожным с областью видимости ключа API, который вы храните на стороне клиента, и с теми вызовами API к Discourse, которые вы выполняете, чтобы не раскрыть ваш глобальный ключ API пользователям, поскольку Next.js, похоже, является фреймворком для клиентской части, а не серверной. Правильный способ, вероятно, заключается в том, чтобы Next.js выполнял серверный API-запрос, который затем делает авторизованный вызов API к вашему экземпляру Discourse.

Этот ответ может вам помочь:

> <https://stackoverflow.com/questions/65862928/how-to-send-headers-using-swr/65863845#65863845>

> Согласно документации [Arguments](https://swr.vercel.app/docs/arguments) вы должны сделать
> 
> ```
> const fetcher = (url, token) =>
> axios
> .get(url, { headers: { Authorization: "Bearer " + token } })
> .then((res) => res.data);
> 
> const { data, error } = useSWR(
> [`http://localhost:8000/api/v1/users/get-avatar`, auth.token],
> fetcher
> );
> if (error) console.log(error);
> if (data) console.log(data);
> 
> ```
