3

我对使用 facebook 进行身份验证 oauth 过程的安全性表示怀疑。

我使用带有 javascript sdk 和 fb 按钮的 web 登录:

我成功获得了访问令牌并将其传递给服务器(调用 check_facebook_session.php)以对 Facebook Provider 进行 API 调用。在以下代码中,还有访问令牌的登录控制台。

一切正常!!!在服务器上,我使用 php sdk 通过 APPID、APPSECRET 和 ACCESS_TOKEN 调用 API REST:

** 现在我的问题是,我有安全问题吗?将令牌传递给服务器是一个坏主意吗?可以在没有 APP SECRET 的情况下使用客户端上可见的令牌来获取有关登录用户的信息?**

注意:服务器端应用程序的 Google+ 登录 使用步骤实现一次性代码流程:

- Include the Google+ script on your page.
- Add the sign-in button to your page.
- Sign in the user.
- Send the authorization code to the server.

as explained in: https://developers.google.com/+/web/signin/server-side-flow

与 js 客户端中的 facebook google 不同,它返回 CODE,而不是 ACCES TOKEN,服务器接收并使用它来请求 ACCESS TOKEN。

谢谢..

Following is the javascript code for facebook:

window.fbAsyncInit = function() {
  FB.init({
    appId      : FACEBOOK_APP_ID, // App ID
    status     : true, // check login status
    cookie     : false, // enable/disable cookies to allow the server to access the session
    xfbml      : true  // parse XFBML
  });

  FB.Event.subscribe('auth.authResponseChange', function(response)
  {
    if (response.status === 'connected')
    {
      var accessToken = FB.getAuthResponse()['accessToken'];
      console.log(accessToken);

      $.ajax({
          type: 'POST',
          url: check_facebook_session.php,
          contentType: 'application/x-www-form-urlencoded; charset=utf-8',
          processData: false,
          data: 'token=' + accessToken,
          success: function(result)
          {
            if(result == 'SUCCESS'){window.location.href = fb_callback_url}
          },
          error: function(xhr)
          {
              alert('Request Status: ' + xhr.status + ' Status Text: ' + xhr.statusText + ' ' + xhr.responseText);
          }
        });
    }
    else if (response.status === 'not_authorized')
    {
      FB.login();
    }
    else
    {
      FB.login();
    }
  });
  };

  // Load the SDK asynchronously
.......
  }(document));
4

3 回答 3

1

我做了一些测试,得出了我希望有用的结论。

在 Facebook SDK for JavaScript 中,它会自动处理访问令牌存储和登录状态跟踪,因此使用它的应用程序不需要为此创建自己的机制,并且可以继续进行 API 调用。

系统似乎是安全的,因为我相信调用的回调 url 是托管页面的站点并在 facebook 应用程序的站点之间进行配置,所以我可以在 javascript 代码中更改应用程序 ID,但 sdk 响应带有错误消息并获取用户的令牌伪装成另一个应用程序。这对于那些了解流程的人来说已经很明显了:-)

将令牌传递给服务器绝对是一个坏主意,因为它可以通过简单地调用https://graph.facebook.com/me?access_token= ... 来获取用户信息,在谷歌的不同流程中令牌没有传递,但传递了获取它所需的代码。

利用客户端和服务器优势的最佳解决方案是:

与 Facebook SDK for JavaScript 结合使用,PHP SDK 可以在客户端和服务器之间无缝共享用户会话。如果人们使用 Facebook 登录并授权了您的应用程序,JavaScript SDK 可以获取用户会话并将其保存在 cookie 中,PHP SDK 读取该 cookie 而无需开发人员的任何干预。要启用此功能,请确保在嵌入和初始化 JS SDK 时,将传递给 FB.init() 的对象的状态和 cookie 参数都设置为 true。

问候..

于 2013-11-13T10:38:51.430 回答
0

我已经按照 Facebook 示例通过使用获取访问令牌$fb->getJavaScriptHelper();

https://developers.facebook.com/docs/php/howto/example_access_token_from_javascript

$helper = $fb->getJavaScriptHelper();
$accessToken = $helper->getAccessToken();
echo $accessToken->getValue();

PS 添加try{} catch() {}块,如 Facebook 示例中的错误处理。

于 2017-08-17T16:25:19.700 回答
0

i think it is secure because the user's data is only returned with connected status after user authentication with facebook.

https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

于 2017-04-20T10:07:01.800 回答