DenOAuth — это легкое стороннее промежуточное ПО для аутентификации с открытым исходным кодом, созданное для Deno на основе js-client-oauth2. Библиотека DenOAuth совместима с Oak, Abc, Pogo и Opine. Этот модуль предназначен для простой реализации в любых веб-приложениях, созданных с помощью этих фреймворков Deno (с дальнейшим развитием). С помощью DenOAuth вы можете инициировать аутентификацию в своем приложении с помощью простого импорта и нескольких ключевых методов.

Прежде чем мы начнем…

Важно, чтобы мы рассмотрели основы Deno и OAuth 2.0, прежде чем погрузиться в библиотеку DenOAuth, поэтому давайте начнем, чтобы мы могли перейти к хорошему!

Дено

Deno — это среда выполнения для JavaScript и TypeScript, основанная на движке JavaScript V8 и языке программирования Rust. Он был создан Райаном Далем, первоначальным создателем Node.js, одной из самых популярных сред выполнения в мире, которая в 2018 году достигла более 1 миллиарда загрузок по всему миру.

Deno был разработан как альтернатива Node.js, подчеркивая высокую безопасность, производительность и обращаясь к нескольким аспектам Node, которые, по мнению самого Даля, он мог бы улучшить с помощью Deno.

ОАут 2.0

OAuth (открытая аутентификация) — это структура авторизации, которая предоставляет приложениям возможность безопасного назначенного доступа, как выразился Роб Соберс. OAuth обычно используется пользователями Интернета для предоставления веб-сайтам или приложениям доступа к информации, которая существует на другом веб-сайте или в приложении без предоставления ваших паролей. Эта последняя часть огромна с точки зрения онлайн-безопасности.

Например, всякий раз, когда вы даете веб-сайту разрешение на доступ к вашему профилю и публикацию в ленте социальных сетей — это OAuth.

OAuth работает, когда клиентское приложение сначала запрашивает токен доступа с сервера авторизации. После того, как пользователь дает разрешение клиентскому приложению на использование своих данных, сервер авторизации отправляет токен доступа клиентскому приложению, которое, в свою очередь, отправляет этот токен доступа в виде запроса к стороннему API, содержащему нужные данные пользователя. Как только API подтвердит, что токен доступа содержит правильные разрешения, он отправляет данные обратно в клиентское приложение.

Если это кажется сложным процессом или вы просто визуальный ученик, как и я, я рекомендую ознакомиться с этой статьей Такахико Кавасаки, где он предоставляет простое руководство по OAuth 2.0.

DenOAuth

DenOAuth предлагает стратегию аутентификации для LinkedIn, GitHub, Spotify, Google и Discord (подробнее в разработке), которые в настоящее время совместимы с Oak, Abc, Pogo и Opine. Каждая стратегия использует простой трехэтапный процесс реализации OAuth.

Для начала убедитесь, что вы импортировали DenOAuth в свое приложение. Мы будем использовать стратегию GitHub для этой демонстрации. Каждая стратегия строится немного по-своему, поэтому, если вы ищете стратегии LinkedIn или Google, вы можете найти некоторые примеры тех, которые реализованы в каждой из вышеупомянутых структур здесь.

import { GitHubClient } from ‘https://deno.land/x/[email protected]/mod.ts';

Процесс

Первое: инициализируйте новый объект для вашего клиента.

const GitHubObject = new GitHubClient({
 clientId: ‘<your client id>’,
 clientSecret: “<your secret key>”,
 tokenUri: ‘https://github.com/login/oauth/access_token',
 redirect: “http://localhost:3000/auth/github/callback", 
 // The redirect uri is added in the GitHub OAuth developer settings
 scope: “read:user” 
});

Здесь мы создаем новый экземпляр GitHubClient, передавая ваш идентификатор клиента, секретный ключ и URL-адрес перенаправления. clientId и clientSecret предоставляются поставщиком (в данном случае GitHub), а перенаправление назначается вами, разработчиком. Свойство redirect в объекте GitHubClient должно быть рабочей страницей вашего приложения, на которую GitHub может перенаправить.

Второе: вызовите метод createLink, чтобы перенаправить пользователя на ввод учетных данных для авторизации.

router.get('/gitHub', (ctx) => {
   ctx.response.body = {
        message: 'success',
        data: ctx.response.redirect(GitHubObject.code.createLink())    
   };
});

Когда пользователь нажимает кнопку для входа через GitHub на вашей странице входа, он сначала будет перенаправлен на страницу авторизации GitHub для ввода учетных данных для API, а затем перенаправлен обратно на URL-адрес обратного вызова (обычно домашняя страница вашего веб-приложения), который вы ввели в свой redirect при создании экземпляра объекта GitHubClient. Просто добавьте метод createLink в тело ответа вашего запроса на получение, и все готово.

Третье: вызовите наш метод processAuth, указав в качестве параметра текущий URL.

router.get('/auth/github/callback', async (ctx) => {
// Exchange the authorization code for an access token and exchange token for profile
const userProfile: any = await GitHubObject.code.processAuth(ctx.request.url);    
// userProfile is an object of information given by GitHub. You can destructure the object to grab specific information    
const { name } = userProfile;
ctx.response.body = `Hello, ${name}!`;
})

Как только пользователь будет перенаправлен обратно на URL-адрес обратного вызова после ввода действительных учетных данных, вы заметите, что в конце вашего URL-адреса добавлен значительный объем нового кода из объекта ответа. Этот URL-адрес — это то, что мы называем «текущий URL-адрес».

Метод processAuth извлекает дополнительный код из текущего URL-адреса и обменивает его на токен доступа. Затем processAuth обменяет токен на информацию о пользователе, предоставленную сторонним API.

И вот оно! Вся работа по созданию правильного URL-адреса авторизации и обмену токена доступа на нужные данные выполняется «под капотом», поэтому вы можете сэкономить время на построении остальной части вашего приложения. Надеюсь, вы найдете эту библиотеку полезной в своих усилиях по OAuth, и мы с нетерпением ждем возможности выпустить больше сторонних стратегий и фреймворков Deno в ближайшем будущем!

Вы можете найти больше информации о DenOAuth здесь.

Команда

Ник Эколс |LinkedIn| Гитхаб

Дан Нгуен | LinkedIn | Гитхаб

Мэтт Миллер | LinkedIn | Гитхаб

Макс Ли | LinkedIn | Гитхаб