0

RFC 2617指定了HTTP Basic 和 Digest Auth标准,其工作原理在Wikipedia 的“Example with explanation”小节中进行了总结:

  • 客户端请求一个需要身份验证但不提供用户名和密码的页面。通常这是因为用户只需输入地址或点击页面链接。
  • 服务器以 401“客户端错误”响应代码进行响应,提供身份验证领域和一个随机生成的、一次性的值,称为 nonce。
  • 此时,浏览器将向用户显示身份验证领域(通常是对正在访问的计算机或系统的描述)并提示输入用户名和密码。用户此时可以决定取消。
  • 提供用户名和密码后,客户端会重新发送相同的请求,但会添加包含响应代码的身份验证标头。
  • 在此示例中,服务器接受身份验证并返回页面。如果用户名无效和/或密码不正确,服务器可能会返回“401”响应码,客户端会再次提示用户。

注意:客户端可能已经拥有所需的用户名和密码,而无需提示用户,例如,如果它们先前已由 Web 浏览器存储。

我正在使用Facebook实施的OAuth2 草案标准执行登录。

给定一个具有公开的公共 API(例如:JSONRPC 或 REST)的服务器,如何编写客户端 JavaScript 前端以包含前面提到的 RFC 2617 示例中的那种功能,但对于 Facebook 身份验证?

4

1 回答 1

1

我找到了一个官方(但未维护,现已正式放弃)示例客户端 JavaScript 库实现示例的存储库,单击此处查看最新的 fork。这是该页面中的 JQuery 示例:

<head>
      <meta http-equiv="content-type" content="text/html; charset=utf-8">
      <title>Connect JavaScript - jQuery Login Example</title>
  </head>
  <body>
      <h1>Connect JavaScript - jQuery Login Example</h1>
      <div>
          <button id="login">Login</button>
          <button id="logout">Logout</button>
          <button id="disconnect">Disconnect</button>
      </div>
      <div id="user-info" style="display: none;"></div>
      <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js">
    </script>
  <div id="fb-root"></div>
  <script src="http://connect.facebook.net/en_US/all.js"></script>
  <script>
      // initialize the library with the API key
      FB.init({
          apiKey: '48f06bc570aaf9ed454699ec4fe416df'
      });


      // fetch the status on load
      FB.getLoginStatus(handleSessionResponse);

      $('#login').bind('click', function () {
          FB.login(handleSessionResponse);
      });


      $('#logout').bind('click', function () {
          FB.logout(handleSessionResponse);
      });

      $('#disconnect').bind('click', function () {
          FB.api({
              method: 'Auth.revokeAuthorization'
          }, function (response) {
              clearDisplay();
          });
      });

      // no user, clear display
      function clearDisplay() {
          $('#user-info').hide('fast');
      }

      // handle a session response from any of the auth related calls
      function handleSessionResponse(response) {
          // if we dont have a session, just hide the user info
          if (!response.session) {
              clearDisplay();
              return;
          }

          // if we have a session, query for the user's profile picture and name
          FB.api({
              method: 'fql.query',
              query: 'SELECT name, pic FROM profile WHERE id=' + FB.getSession().uid
          },

          function (response) {
              var user = response[0];
              $('#user-info').html('<img src="' + user.pic + '">' + user.name).show('fast');
          });
      }
  </script>

随时提出改进建议。理想情况下,我希望看到:

  • 原生 JavaScript 实现
  • JSONRPC 调用以方便在个人服务器端登录
  • 路由(即:成功登录后重定向到登录用户主页)
于 2012-07-13T15:52:48.140 回答