Подтвердить что ты не робот

Как реализовать безопасное потребление OAuth2 в Javascript?

Я занимаюсь разработкой API на PHP, который будет использовать OAuth2.0. Моя конечная цель - создать интерфейсное приложение в javascript (используя AngularJS), который обращается к этому API напрямую. Я знаю, что традиционно нет возможности защищать транзакции в javascript, и поэтому прямой доступ к API невозможен. Переднему интерфейсу необходимо будет связываться с кодом сервера, который, в свою очередь, напрямую связывается с API. Однако, исследуя OAuth2, похоже, что поток User-Agent предназначен для помощи в этой ситуации.

Мне нужна помощь в реализации потока User-Agent OAuth2 в javascript (в частности, AngularJS, если это возможно, как то, что я использую для моего front-end). Я не смог найти ни одного примера или учебников, которые это сделают. Я действительно не знаю, с чего начать и не хочу читать всю спецификацию OAuth2, хотя бы, по крайней мере, не вижу примера того, что я буду делать. Поэтому были бы очень полезны любые примеры, учебные пособия, ссылки и т.д.

4b9b3361

Ответ 1

Неявный поток грантов (тот, который вы называете потоком User-Agent) - это именно то, что нужно сделать:

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

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

Вот краткий пример реализации потока с использованием Soundcloud API и jQuery, взятых из этого ответа:

<script type="text/javascript" charset="utf-8">
  $(function () {
    var extractToken = function(hash) {
      var match = hash.match(/access_token=([\w-]+)/);
      return !!match && match[1];
    };

    var CLIENT_ID = YOUR_CLIENT_ID;
    var AUTHORIZATION_ENDPOINT = "https://soundcloud.com/connect";
    var RESOURCE_ENDPOINT = "https://api.soundcloud.com/me";

    var token = extractToken(document.location.hash);
    if (token) {
      $('div.authenticated').show();

      $('span.token').text(token);

      $.ajax({
          url: RESOURCE_ENDPOINT
        , beforeSend: function (xhr) {
            xhr.setRequestHeader('Authorization', "OAuth " + token);
            xhr.setRequestHeader('Accept',        "application/json");
          }
        , success: function (response) {
            var container = $('span.user');
            if (response) {
              container.text(response.username);
            } else {
              container.text("An error occurred.");
            }
          }
      });
    } else {
      $('div.authenticate').show();

      var authUrl = AUTHORIZATION_ENDPOINT + 
        "?response_type=token" +
        "&client_id="    + clientId +
        "&redirect_uri=" + window.location;

      $("a.connect").attr("href", authUrl);
    }
  });
</script>
<style>
  .hidden {
    display: none;
  }
</style>

<div class="authenticate hidden">
  <a class="connect" href="">Connect</a>
</div>

<div class="authenticated hidden">
  <p>
    You are using token
    <span class="token">[no token]</span>.
  </p>

  <p>
    Your SoundCloud username is
    <span class="user">[no username]</span>.
  </p>
</div>

Для отправки XMLHttpRequests (что делает функция ajax() в jQuery) с помощью AngularJS, обратитесь к их документации $http сервис.

Если вы хотите сохранить состояние, при отправке пользователя в конечную точку авторизации, проверьте параметр state.

Ответ 2

Вот пример подхода Authorization Code Grant для получения маркера с сервера OAuth. Я использовал jQuery ($) для выполнения некоторых операций.

Сначала перенаправляйте пользователя на страницу авторизации.

var authServerUri = "http://your-aouth2-server.com/authorize",
authParams = {
  response_type: "code",
  client_id: this.model.get("clientId"),
  redirect_uri: this.model.get("redirectUri"),
  scope: this.model.get("scope"),
  state: this.model.get("state")
};

// Redirect to Authorization page.
var replacementUri = authServerUri + "?" + $.param(authParams);
window.location.replace(replacementUri);

Когда кто-то дал пропуск авторизации, чтобы получить токен:

var searchQueryString = window.location.search;
if ( searchQueryString.charAt(0) === "?") {
  searchQueryString = searchQueryString.substring(1);
}
var searchParameters = $.deparam.fragment(searchQueryString);

if ( "code" in searchParameters) {
  // TODO: construct a call like in previous step using $.ajax() to get token.
}

Вы можете реализовать Resource Owner Password Credentials Grant таким же образом, используя jQuery или чистый XMLHttpRequest и не делайте никаких переадресаций, потому что при каждой перенаправлении вы потеряете состояние своего приложения.

Для меня я использовал локальное хранилище HTML5 для сохранения состояния моего приложения для данных, которые вряд ли могут представлять угрозу безопасности.