FB.login Нужны ли изменения в Javascript к октябрю? - PullRequest
3 голосов
/ 30 августа 2011

Итак, мы впервые переключились с Facebook Connect на новый Javascript SDK и OpenGraph.

Еще в мае некоторые наши клиенты получили электронное письмо, в котором говорилось, что у них могут быть дыры в безопасности, и что им может потребоваться обновление до Oauth 2.0. Я посмотрел наш новый код по сравнению с документами для FB.login в то время, и у меня сложилось впечатление, что клиенты, использующие наш новый материал, будут в порядке, поэтому пользователям старой версии нашего продукта на Facebook Connect придется обновиться до последняя версия.

Сегодня до меня дошло, что Javascript SDK был изменен, так что для использования OAuth 2.0, в конце концов, необходимо будет внести изменения в код. (т. е. это сообщение в блоге , которое было создано через месяц после того, как электронное письмо вышло), и что мне нужно обновить его до 1 октября.

Итак, сегодня я попытался просто установить флаг «Oauth 2.0 Migration» моего приложения в true и запустить его с тем же кодом. Это сработало, чего я не ожидал. Поэтому мой вопрос: нужно ли вносить изменения в код, описанные в сообщении в блоге, или нет? Если приложение работает сегодня с установленным флажком «Миграция Oauth 2.0», является ли это действительным основанием полагать, что оно продолжит работать после 1 октября?

Вот мой код:

// call to FBinit does not include oauth: true
FB.init({appId: opts.ApiKey, status: true, cookie: true, xfbml: true});

// call to login expects response.session on response. not response.authResponse. 
// Shame on Facebook for arbitrarily renaming that so I can't do a clean swap.
FB.login(function(response){
    if(response.session){
        var access_token = response.session.access_token;
        // blah blah blah
    }
});

Ответы [ 3 ]

1 голос
/ 04 сентября 2011

Да, вам нужно внести изменения в код JS SDK (http://developers.facebook.com/docs/oauth2-https-migration/), чтобы включить oauth: true в функцию FB.init и другие изменения, упомянутые в сообщении в блоге.

Параметр миграции в приложении Dev просто указывает на то, что вы получите зашифрованный токен доступа (см. Подсказку).

0 голосов
/ 31 августа 2011

Код выше не использует Oauth2.Он будет работать как есть до тех пор, пока они не решат заставить вас использовать Oauth2.

Чтобы переключиться, вам нужно добавить oauth: true к вызову FB.init, как упоминалось в сообщении в блоге, на которое вы ссылались.Основным изменением является то, что response.session становится response.authResponse

Также есть много других изменений, поэтому я рекомендую протестировать его сейчас.Мне понадобилось несколько часов, чтобы перейти на наш сайт, но большая часть этого заставляла куки работать, потому что с Oauth2 они совершенно разные, и мы хотели сгенерировать access_token из куки.

Вы можете проверитьплагин Rails, который я обновил для Oauth2 - https://github.com/imme5150/fgraph код cookie здесь: https://github.com/imme5150/fgraph/blob/master/lib/fgraph/rails/fgraph_helper.rb внизу.Другая хитрость заключается в том, чтобы получить токен доступа из параметра «code», хранящегося в cookie, вы делаете вызов графа FB, но вам нужно включить параметр «redirect_uri», но вы хотите, чтобы он был пустым.

Удачи!

0 голосов
/ 30 августа 2011

Я бы изменил весь код, также включив O-2.0, и использование старых методов аутентификации может прервать сеанс, в результате чего пользователи не смогут выйти из приложения, или оставить сеанс в приложении, когда пользователь выходит из Facebook.


При включенной новой O-2.0 и отключенной старой аутентификации я использую приведенный ниже пример, интегрированный с php-sdk 3.1.1, без каких-либо ошибок или проблем.

      <div id="FBauth"></div>
      <div id="fb-root"></div>
<script>
      window.fbAsyncInit = function() {
        FB.init({
    appId  : '112104298812138',
    status : true, // check login status
    cookie : true, // enable cookies to allow the server to access the session
    xfbml  : true, // parse XFBML
    //channelUrl : 'http://WWW.MYDOMAIN.COM/channel.html', // channel.html file
    oauth  : true // enable OAuth 2.0
        });
FB.Canvas.EarlyFlush.addResource("http://shawnsspace.com/index.php");
FB.Canvas.setAutoResize();
            FB.getLoginStatus(function(response) {
              if (response.authResponse) {
                // logged in and connected user, someone you know
                var authbox = document.getElementById('FBauth');
                //authbox.innerHTML="Hey" +authResponse.name+ "";
                authbox.innerHTML="<fb:login-button autologoutlink='true'></fb:login-button><fb:login-button show-faces='true' width='250' max-rows='1'></fb:login-button>";
                FB.XFBML.parse(authbox);
                //var a = document.createElement('a');
                //alert();
              } else {
                // no user session available, someone you dont know
                var authbox = document.getElementById('FBauth');
                authbox.innerHTML="";
                var a = document.createElement('a');
                a.setAttribute("href","javascript:void();");
                a.setAttribute("onclick","FBlogin();");
                a.innerHTML="Please Login";
                authbox.appendChild(a);
                //alert('not logged in'+response+'');
//
        window.FBlogin = function(){
                FB.login(function(response) {
               if (response.authResponse) {
                 FB.api('/me', function(response) {
                 });

               } else {
               top.location.href = "http://apps.facebook.com/shawnsspace/";
                 // user cancealed login.
               }
             }, {scope: 'manage_pages'});
        };
//          
              }
            }); 

        FB.Event.subscribe('auth.login', function(response) {
        top.location.href = 'http://apps.facebook.com/shawnsspace/';
        });
        FB.Event.subscribe('auth.logout', function(response) {
        //top.location.href = "http://facebook.com/designbyshawn";
        });
      };
      (function() {
        var e = document.createElement('script'); e.async = true;
        e.src = document.location.protocol +
          '//connect.facebook.net/en_US/all.js';
        document.getElementById('fb-root').appendChild(e);
      }());
</script>
...