一尘不染

如何在Javascript中实现安全的OAuth2使用?

angularjs

我正在使用OAuth2.0在PHP中设计API。我的最终目标是用javascript(使用AngularJS)构建可直接访问此API的前端应用程序。我知道,传统上无法用javascript保护交易,因此直接访问API是不可行的。前端需要与服务器代码进行通信,而服务器代码又直接与API进行通信。但是,在研究OAuth2时,似乎好像是在设计User-
Agent Flow来帮助解决这种情况。

我需要帮助的是在javascript中实现OAuth2用户代理流程(如果可能的话,尤其是AngularJS,因为这是我在前端使用的功能)。我还没有找到执行此操作的任何示例或教程。我真的不知道从哪里开始,也不想通读整个OAuth2规范,而至少没有看到我将要做的事情的示例。因此,任何示例,教程,链接等都将不胜感激。


阅读 176

收藏
2020-07-04

共1个答案

一尘不染

隐格兰特流(你指的是作为一个 用户代理流量 )正好是要走的路:

隐式授权是简化的授权代码流程,该流程针对使用脚本语言(例如JavaScript)在浏览器中实现的客户端进行了优化。

要了解流程,Google的客户端应用程序文档是一个很好的起点。请注意,他们建议您采取额外的
令牌验证 步骤,以避免混淆的代理问题

<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
发送XMLHttpRequests(该ajax()函数在jQuery中的功能),请参阅其$http服务文档。

如果要保留状态,则在将用户发送到授权端点时,请签出该state参数。

2020-07-04