GitHub Octokit/rest.js OAuth для одностраничных приложений

#javascript #github #oauth #single-page-application #octokit

#javascript #github #oauth #одностраничное приложение #octokit

Вопрос:

Я использую клиент GitHub API ‘octokit/rest.js ‘ в одностраничном приложении Angular (SPA). Учитывая, что это, как правило, более безопасно и что я использую двухфакторную аутентификацию для своей учетной записи GitHub (одного пароля недостаточно) Я хотел использовать рабочий процесс OAuth. Я следовал инструкциям здесь для получения токена доступа, а затем использовал это для сборки клиента octokit:

 login(token: string) {
  this.client = new Octokit({
    auth: `token ${token}`
  });
}
  

Чтобы получить токен, мне пришлось создать простой серверный интерфейс, цель которого — просто получить токен и передать его интерфейсу, поскольку я не разработал, как сделать это безопасно из SPA (для этого требуется client_secret, который я не могу обеспечить во внешнем интерфейсе?). Кажется, это работает, но у меня все еще остаются важные вопросы:

  • Безопасно ли это? Или токен доступа должен храниться только на стороне сервера?
  • Есть ли лучший способ обработки аутентификации octokit / GitHub API только из интерфейса?

Ответ №1:

ocotkit/rest.js сопровождающий здесь 👋

client_secret Не может быть передан клиенту. Для потока OAuth требуется серверная часть, которая обеспечивает client_secret безопасность.

Альтернативой является создание токена с использованием вашего имени пользователя и пароля, в этом случае вам не нужен серверный компонент. Но обычно пользователи могут неохотно предоставлять свои учетные данные для входа на внешний веб-сайт. Но для личных / внутренних проектов это может быть самый простой способ сделать это.

 let octokit = new Octokit({
  auth: {
    username: USERNAME,
    password: PASSWORD,
    on2fa () {
      return prompt('Enter code')
    }
  }
})

octokit.oauthAuthorizations.createAuthorization({
  scopes: [], // add scopes
  note: 'token description'
})

  .then(({ data: { token } }) => {
    octokit = new Octokit({ auth: 'token ${token}' })
    // octokit is now authenticated with token
  })  

Обратите внимание, что токен note должен быть уникальным. Если вы ранее создавали токен с такой же пометкой, вам нужно будет использовать другую пометку или сначала удалить существующий токен.

В настоящее время мы рассматриваем возможность добавления дополнительных auth.* опций, чтобы токен создавался для вас внутренне перед отправкой любого запроса. Мы обсуждаем это изменение на https://github.com/octokit/rest.js/pull/1293 если вам интересно

Комментарии:

1. Спасибо за ответ @Gregor! Да, я знаю, что клиентские секреты не должны передаваться во внешнем интерфейсе. Вот почему у меня есть минималистичный серверный интерфейс, который выполняет единственную задачу получения токена и передачи его интерфейсу. Однако я все еще не уверен, безопасно ли это, поскольку, если связь между сервером / интерфейсом перехвачена, не может ли злоумышленник взять токен и использовать его самостоятельно? Мой конкретный проект здесь , если это поможет прояснить мою текущую архитектуру.

2. Пока сервер защищен с помощью SSL, проблем быть не должно.