GitHub Octokit / rest.js OAuth для одностраничных приложений - PullRequest
1 голос
/ 26 марта 2019

Я использую клиент 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 Ответ

1 голос
/ 26 марта 2019

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, если вы заинтересованы

...