1

我正在尝试通过客户端授权流程使用 JS 做 3 件简单的事情:

  1. 检查用户是否已登录。如果没有,则显示具有适当范围的登录对话框。
  2. 如果用户已经在浏览器上登录 Facebook,则确保应用程序已被授权(如果没有,则显示授权对话框)。
  3. 如果用户已经授权应用程序,则确保 authResponse 上的 access_token 具有应用程序所需的正确范围(权限)。(如果没有,重新显示新权限的授权对话框)。

我正在尝试为此利用 js sdk,而不想编写任何手动编码的对话框等,因为 sdk 会自动处理浏览器/设备的细微差别。

我无法在 FB 文档或其他任何地方找到正确描述的内容。(没有关于应用程序的权限/范围可以更改授权后的事实的文档)。

提前谢谢你。

4

1 回答 1

0

经过艰苦的尝试,我完成了这项工作,以下是使用最少代码量的步骤。

*方法 *

  1. 使用 fb-login-button 方便登录。登录按钮是用户第一次到达页面时显示的唯一内容。所有其他表单都是“隐藏的”,迫使用户在继续之前单击此按钮。
  2. 设置 onlogin="function();" 在 fb-login-button 上 - 这样您就可以隐藏登录按钮并显示其余的表单/等,以便用户继续使用您的应用程序。请注意,onlogin 仅被调用一次(当用户登录或使用新范围授权应用程序时) - 因此始终隐藏登录按钮并显示页面/表单的其余部分以供用户继续是安全的.
  3. 最重要的一步:使用相同的 fb-login-button 也可以在正确的范围内进行授权:所以即使用户已登录 - 强制用户单击登录按钮。在这种情况下,fb-login-button 将检查现有 access_token 的范围(对于已登录的 fb 用户)是否是 fb-login-button 属性上请求的范围的子集。在这种情况下,fb-login-button 将自动为您显示授权对话框。在任何情况下都会触发 onLogin 回调(当登录按钮应该被隐藏()并且剩余的页面/表单被显示()时)。
  4. 订阅 FB.events 以在每次设置时获取 authResponses 和相应的 access_token,这会发生 2 次:当首次为已登录的用户 b 显示提取时。在用户第一次或第二次使用新范围授权应用程序之后。这使您可以保持 authResponse 和 access_token 新鲜,以用于所有后续图形调用/等。

*实施步骤 *

  1. fb-login-button 必须使用 onlogin 回调创建:

    <div class="fb-login-button" onLogin="onLogin();" scope="publish_actions" data-size="large">Use This App</div>

请注意,文字不是登录,而是“使用此应用程序”,因为除了登录之外,还会显示授权按钮。

  1. 订阅事件。

    // authRepsonse Change is needed when the user hits the UseApp button
    // and permissions are re-fetched - then a new token needs to be refreshed
    FB.Event.subscribe('auth.authResponseChange', handleResponseChange);

    // when the user logins and all permissions are all set, clicking on the // use-app will not do anything and authResponse will always be null. // so this subscription is necessary FB.Event.subscribe('auth.statusChange', handleResponseChange);

  2. 登录功能隐藏登录按钮并显示表单。

       function onLogin () {
            hideLogin();
            showMain();
        }
    

  3. 处理状态更改以保存令牌。

    // global variable that contains the access_token 
    // for use in graph calls/etc.
    var authResponse = null;
    
    function handleResponseChange(response) {
        if (response && response.authResponse) {
            authResponse = response.authResponse
            if (response.status == 'connected') {
               updateUserInfo(response);
               return;
           }
        }
        else { 
           authResponse = null;
        }
        hideMain();
        showLogin();
    }
    


希望这会有所帮助,我相信这可能是处理客户端身份验证流程的最佳方式,无需进行任何额外的授权/登录对话,让 FB sdk 来解决问题。

于 2012-05-29T18:25:42.517 回答