Статьи

OAuth с NancyFX и WorldDomination.Web.Authentication

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

Поэтому PureKrome и я решили создать WorldDomination: веб-аутентификация

Идея этого фреймворка заключается в том, чтобы внедрить OAuth на свой сайт без лишних хлопот. Базовая структура работает ТОЛЬКО с аутентификацией Google, Twitter и Facebook. Он не пытается создать модный пользовательский интерфейс для вас, он не требует написания большого и большого количества кода. Вы просто даете ему некоторую информацию, он перенаправляет, он возвращается и дает вам информацию аутентификации.

Совсем недавно ребята, участвовавшие в разработке JabbR, решили использовать библиотеку, и с помощью обратной связи мы добавили действительно потрясающую поддержку NancyFX, которую я покажу.

Установка

Установка библиотеки для Nancy требует установки библиотеки для Nancy.

PM> Install-Package Nancy.Authentication.WorldDomination

Это установит:

  • Nancy.Authentication.WorldDomination
  • WorldDomination.Web.Authentication
  • RestSharp

Первый пакет — это провайдер Nancy, который соединяет все маршруты и обрабатывает перенаправление и обратный вызов.

Второй пакет является фактической реализацией, он не зависит от NancyContextилиSystem.Web

Последний пакет требуется WorldDomination.Web.Authenticationдля обработки обратного вызова и десериализации ответа.

Настройка

Теперь, когда он установлен, нам нужно его настроить, это можно сделать одним из двух способов: путем добавления информации в web.configили путем регистрации информации вBootstrapper

Я собираюсь показать web.configпуть, но вы можете посетить вики-сайт github для получения WorldDomination.Web.Authenticationинформации для настройки через загрузчик.

В разделе web.configдобавления конфигурации, как это

<section name="authenticationProviders"
         type="WorldDomination.Web.Authentication.Config.ProviderConfiguration, WorldDomination.Web.Authentication" />

Теперь добавьте authenticationProvidersэлемент.

<authenticationProviders>
  <providers>
    <add name="Facebook" key="470874...41" secret="02bb584...332fe2" />
    <add name="Google" key="58714009...ent.com" secret="npk...ooxCEY" />
    <add name="Twitter" key="Rb7qNNP...znFTbF6Q" secret="pP...7hu9c" />
  </providers>
</authenticationProviders>

Вы можете получить ключ / секрет, регистрируя ваши приложения:

  • Facebook: http://developers.facebook.com/docs/howtos/login/server-side-login/
  • Twitter: https://dev.twitter.com/
  • Google: https://code.google.com/apis/console/?pli=1#access

Реализация вашего обратного вызова

Теперь вам нужно реализовать обратный вызов, этот обратный вызов — это то, что ВЫ хотите сделать с результатом успешной (или неудачной) аутентификации, вам нужно реализовать это, потому что мы не знаем, что вы запланировали, если вы хотите создать сеанс, установить куки, использовать аутентификацию формы, что угодно, это ваше дело.

Для этого вы можете создать новый класс и реализовать интерфейс IAuthenticationCallbackProvider

public class Test : IAuthenticationCallbackProvider
{
    public dynamic Process(NancyModule nancyModule, AuthenticateCallbackData model)
    {
        return nancyModule.Negotiate.WithView("AuthenticateCallback").WithModel(model);
    }
}

Этот пример просто ответит представлением AuthenticateCallbackи передаст ему модель с данными, возвращенными поставщиком. В идеале вы должны проверить, является ли пользователь новым, или вам нужно добавить его в свою базу данных, или аутентифицировать его в вашей системе.

Вы можете взглянуть на реализацию, используемую JabbR, здесь , которую я отразил как суть здесь, если она изменена или перемещена и ссылка становится мертвой.

Если вы используете Nancy с контейнером TinyIoC по умолчанию, вам не нужно ничего регистрировать, он будет автоматически выбран Nancy.Authentication.WorldDominationи вызван.

Добавление некоторых кнопок

Наконец, вам нужно добавить несколько кнопок на экран. Это где вы должны ссылаться на некоторые конкретные URL.

Два URL-адреса, используемые системой:

  • Redirect: / аутентификация / редирект / ключ провайдера
  • Обратный вызов: / authentication / authenticatecallback? Providerkey = ключ провайдера

Примеры: ссылки, которые вы бы добавили на свою страницу, были бы похожи на:

<a href="/authentication/redirect/Twitter"><img src="/Content/twitter_32.png" /></a>
<a href="/authentication/redirect/Facebook"><img src="/Content/facebook_32.png" /></a>
<a href="/authentication/redirect/Google"><img src="/Content/google_32.png" /></a>

Эти ссылки являются просто обычными гиперссылками, предоставляя вам абсолютную свободу и гибкость в оформлении их по своему желанию. Поскольку мы абсолютно НЕ вовлечены в процесс создания ссылок, мы не можем помешать этому.

Все, что вам нужно сделать, это убедиться, что предоставленные нам ссылки выглядят так, как указано выше.

Ваши URL обратного вызова в конечном итоге будут выглядеть так:

  • / Аутентификации / authenticatecallback? Providerkey = твиттер
  • / Аутентификации / authenticatecallback? Providerkey = facebook
  • / Аутентификации / authenticatecallback? Providerkey = Google

И вы сделали!

Теперь вы можете запустить ваше приложение:

Мы нажимаем на Google:

И мы перенаправлены обратно на сайт после разрешения аутентификации с Google:

Это все, что нужно сделать.

Образец можно найти на github здесь:

Вы можете найти исходный код на github:

И пакеты Nuget