リフレッシュトークン Javascriptで安全なOAuth2の消費を実装するにはどうすればよいですか?



oauth2.0 rfc (2)

私はOAuth2.0を使用するPHPでAPIを設計する過程にあります。 私の最終目標は、このAPIに直接アクセスするフロントエンドアプリケーションをjavascriptで(AngularJSを使用して)構築することです。 伝統的に、JavaScriptを使ってトランザクションを保護する方法はないので、APIに直接アクセスすることは実現できません。 フロントエンドはサーバーコードと通信する必要があり、サーバーコードはAPIと直接通信します。 しかし、OAuth2の研究では、User-Agent Flowがこのような状況で役立つように設計されているように見えます。

私が助けが必要なのは、OAuth2 User-Agent Flowをjavascriptで実装することです(特に、AngularJSは可能な限りフロントエンドに使用しています)。 私はこれを行う例やチュートリアルを見つけることができませんでした。 どこから始めたらいいのか分からず、OAuth2の仕様全体を読んでみたくないと思っています。 だから、例、チュートリアル、リンクなどは非常に高く評価されます。


Answer #1

Implicit GrantフローUser-Agent Flowと呼ばれるもの)はまさにその方法です。

暗黙的な許可は、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>

AngularJSを使用してXMLHttpRequestsajax()関数がjQueryで行うこと)を送信するには、 $httpサービスのドキュメントを参照してください。

状態を保持する場合は、ユーザーを許可エンドポイントに送信するときに、 stateパラメーターをチェックアウトします。


Answer #2

OAuthサーバーからトークンを取得するためのAuthorization Code Grantアプローチの例があります。 いくつかの操作を行うために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.
}

jQueryや純粋なXMLHttpRequestを使用して同じ方法でResource Owner Password Credentials Grantを実装し、リダイレクトを行わないようにすることができます。リダイレクトごとにアプリケーションの状態が緩くなるからです。

私にとっては、HTML5ローカルストレージを使用して、アプリケーションの状態をセキュリティ上の脅威を引き起こす可能性のないデータに維持しました。





consumer