OAuth стал отраслевым стандартом аутентификации. Все основные платформы предоставляют механизм аутентификации через свою сеть.
В этой статье мы проведем пример демонстрации OAuth с использованием Google Auth и загрузим файл в учетную запись G-Drive конкретного пользователя. Демонстрация построена с использованием AdonisJS. Adonis — это среда NodeJS для веб-разработки.
Мы будем использовать Ally, пакет Adonis для аутентификации в социальных сетях. В качестве первого шага нам нужно будет войти в консоль Google API и создать новый проект для нашего сайта. После создания проекта перейдите в раздел учетных данных в левом меню навигации и нажмите кнопку Создать учетные данные. Откроется раскрывающийся список и выберите идентификатор клиента OAuth в параметрах. После выбора опции нам будут предложены варианты переключателей для выбора. Выберите веб-приложение из этой опции и поместите URL-адрес своего доменного имени в раздел Авторизованные источники JavaScript, а URL-адрес обратного вызова укажите в следующем разделе. Поскольку я буду запускать это приложение только локально, я добавлю http://127.0.0.1:3333в качестве источника. Для URL-адреса обратного вызова я добавлю http://127.0.0.1:3333/authenticated/googleв качестве URI.
Пришло время создать наше веб-приложение. Сначала установите Adonis глобально с помощью команды.
npm i -g @adonisjs/cli
Создайте новое приложение, выполняющее команду
adonis new oauth_app
cd в каталог и запустите приложение
adonis serve --dev
Перейдите по этой ссылке, чтобы добавить союзника в свой проект
Создайте AuthController, выполнив команду
adonis make:controller Auth
Новый контроллер будет создан в папке App/Controllers. Теперь настройте маршрут для входа в систему. откройте файл routes.js в стартовой папке. Добавьте два новых маршрута
Route.get('auth/google', 'AuthController.redirect').as('social.login')
Route.get('authenticated/google', 'AuthController.handleCallback').as('social.login.callback')
В AuthController создайте метод с именем redirect и вызовите метод-союзник для аутентификации.
async redirect({ally}) {
await ally.driver('google').scope(['profile', 'email','https://www.googleapis.com/auth/drive']).redirect()
}
Как только пользователь будет аутентифицирован, будет вызван наш зарегистрированный обратный вызов.
async handleCallback({params, ally, auth, response, session}) { const provider = 'google'
try {
const userData = await ally.driver(provider).getUser(); session.put('user', userData.getName()) session.put('accessToken', userData.getAccessToken()) response.redirect('/')
}
catch (error) {
console.log(error);
}
}
Мы сохраним токен доступа и полное имя пользователя в сеансе.
Теперь мы можем сделать загрузку файла. Создайте новый контроллер для управления загрузкой файлов.
adonis make:controller File
Теперь в файле маршрутов добавьте новый маршрут
Route.post('/files', 'FileController.upload')
В FileController создайте новый метод для загрузки файлов
async upload({ request, session, response }) {
const file = request.file("drive_file");
if(!file) return;
const {clientName,type,subtype, tmpPath } = request.file("drive_file");
const token = session.get("accessToken");
const oAuth2Client = new google.auth.OAuth2(); oAuth2Client.setCredentials({ access_token: token });
const drive = google.drive({ version: "v3", auth: oAuth2Client }); const fileMetaData = { name: clientName }
const media = {
mimeType: `${type}/${subtype}`,
body: fs.createReadStream(tmpPath)
}
const promisedCreate = (options) => {
return new Promise((resolve, reject) => { drive.files.create(options,
(err, file) => { if(err) reject(err) resolve(file); }); });
}
try {
const file = await promisedCreate({resource: fileMetaData, media, fields: 'id'});
session.flash({ notification: 'Your file has been uploaded to Google Drive' })
response.redirect("/");
} catch (error) {
session.flash({ notification: error.message }) response.redirect("/");
} }
Теперь у нас есть возможность войти с помощью Google Auth и загрузить его в учетную запись пользователя.
Базовый пользовательский интерфейс и поток веб-сайта приложены ниже.



