#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, проблем быть не должно.