2011-02-11 61 views
0

當你註冊,你得到一個Facebook應用程序什麼是Facebook應用程序的目的,關鍵

應用程序ID:123455678 應用的關鍵:hkjhkh3434hkklljk 應用祕密:jkjljlj1233455jk

是OAuth 2只應用ID(又名CLIENT_ID)和應用程序祕密(又稱client_secret)是有用的。

想知道應用程序密鑰的目的是什麼?這是爲了一些後端的目的嗎?如果是的話,那麼暴露點有什麼意義。

回答

2

我只是想在這裏大聲。

我想這只是爲了向後兼容性,特別是舊的Facebook Connect實現和REST API,其中APP_KEY被使用。

正如你可以在FB.init Javascript的SDK看到:

<div id="fb-root"></div> 
<script> 
    window.fbAsyncInit = function() { 
    FB.init({ 
     appId : 'YOUR APP ID', 
     status : true, // check login status 
     cookie : true, // enable cookies to allow the server to access the session 
     xfbml : true // parse XFBML 
    }); 
    }; 

    (function() { 
    var e = document.createElement('script'); 
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; 
    e.async = true; 
    document.getElementById('fb-root').appendChild(e); 
    }()); 
</script> 

他們不提apiKey這與PHP-SDK使用的代碼。
現在,如果你去老connect-js example

FB.init({ apiKey: '48f06bc570aaf9ed454699ec4fe416df' }); 

所以調試connect.facebook.net/en_US/all.js文件(使用JSBeautifier):

FB.provide('', { 
    init: function (a) { 
     a = FB.copy(a || {}, { 
      logging: true, 
      status: true 
     }); 
     FB._apiKey = a.appId || a.apiKey; 
     if (!a.logging && window.location.toString().indexOf('fb_debug=1') < 0) FB._logging = false; 
     FB.XD.init(a.channelUrl); 
     if (FB._apiKey) { 
      FB.Cookie.setEnabled(a.cookie); 
      a.session = a.session || FB.Cookie.load(); 
      FB.Auth.setSession(a.session, a.session ? 'connected' : 'unknown'); 
      if (a.status) FB.getLoginStatus(); 
     } 
     if (a.xfbml) window.setTimeout(function() { 
      if (FB.XFBML) FB.Dom.ready(FB.XFBML.parse); 
     }, 0); 
    } 
}); 

這裏你可以看到,它的檢查apiIdapiKey,然後存在試圖調用圖api和其他其餘api:

FB.provide('', { 
    api: function() { 
     if (typeof arguments[0] === 'string') { 
      FB.ApiServer.graph.apply(FB.ApiServer, arguments); 
     } else FB.ApiServer.rest.apply(FB.ApiServer, arguments); 
    } 
}); 

和:

graph: function() { 
    var a = Array.prototype.slice.call(arguments), 
     f = a.shift(), 
     d = a.shift(), 
     c, e, b; 
    while (d) { 
     var g = typeof d; 
     if (g === 'string' && !c) { 
      c = d.toLowerCase(); 
     } else if (g === 'function' && !b) { 
      b = d; 
     } else if (g === 'object' && !e) { 
      e = d; 
     } else { 
      FB.log('Invalid argument passed to FB.api(): ' + d); 
      return; 
     } 
     d = a.shift(); 
    } 
    c = c || 'get'; 
    e = e || {}; 
    if (f[0] === '/') f = f.substr(1); 
    if (FB.Array.indexOf(FB.ApiServer.METHODS, c) < 0) { 
     FB.log('Invalid method passed to FB.api(): ' + c); 
     return; 
    } 
    FB.ApiServer.oauthRequest('graph', f, c, e, b); 
}, 
rest: function (e, a) { 
    var c = e.method.toLowerCase().replace('.', '_'); 
    if (FB.Auth && c === 'auth_revokeauthorization') { 
     var d = a; 
     a = function (f) { 
      if (f === true) FB.Auth.setSession(null, 'notConnected'); 
      d && d(f); 
     }; 
    } 
    e.format = 'json-strings'; 
    e.api_key = FB._apiKey; 
    var b = FB.ApiServer._readOnlyCalls[c] ? 'api_read' : 'api'; 
    FB.ApiServer.oauthRequest(b, 'restserver.php', 'get', e, a); 
}, 

正如你可以在這裏看到,它與Old Rest API使用,閱讀文檔有:

的REST API支持OAuth 2.0用戶 以及舊的,定製 授權簽名方案。有關如何將您的 現有會話升級到OAuth 2.0的信息,請參閱 關於 的身份驗證升級指南。

所以APP_KEY肯定是有的爲了向後兼容!

+0

我認爲這是有道理的,它絕對是爲了向後兼容。我還注意到,註銷仍需要應用程序密鑰,例如,註銷一個調用`http://www.facebook.com/logout.php?api_key={application key}&; session_key = {oauth 2.0 code}「 ;對於_OAuth 2.0_兼容性,它應該是`http://www.facebook.com/logout.php?api_id={client_id}&;app_secret={client_secret}&;session_key={oauth 2.0 code};`或者只需`http://www.facebook。com/logout.php?session_key = {oauth 2.0 code};`看起來Facebook在實現OAuth 2.0方面不一致。 – user613343 2011-02-12 17:10:51

相關問題