It is not a bad idea to use Facebook JavaScript SDK if you want to build a full client-side app with Meteor...
Alex C answer works at first glance, but I had some problems with FB.logout() after "navigating" and going back to the "page" where <div id="fb-root"></div> was defined, because when fb-root is re-rendered, FB.logout() stops working.
So I think the best way to load Facebook JavaScript SDK is to use a Template created callback:
Template.fbLogin.created = function () { if (!Session.get("is Facebook JDK loaded?")) { Session.set("is Facebook JDK loaded?", true); // https://developers.facebook.com/docs/reference/javascript/ window.fbAsyncInit = function() { // init the FB JS SDK FB.init({ appId : '[YOUR_APP_ID]', // App ID status : true, // check login status cookie : true, // enable cookies to allow the server to access the session xfbml : true // parse XFBML }); // Additional initialization code such as adding Event Listeners goes here }; // Load the SDK's source Asynchronously // Note that the debug version is being actively developed and might // contain some type checks that are overly strict. // Please report such bugs using the bugs tool. (function(d, debug){ var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) {return;} js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all" + (debug ? "/debug" : "") + ".js"; ref.parentNode.insertBefore(js, ref); }(document, /*debug*/ false)); } };
Also, other thing that needs to be done for FB.logout() to work correctly is using a constant template helper around <div id="fb-root"></div>. So your code should be like this:
<body> {{#constant}} <div id="fb-root"></div> {{/constant}} <!-- rest of body... -->
I also found that it is necessary to put fb-root immediately after body.
There is a live app running code like this at http://evee.meteor.com
And you can find its source-code here: https://github.com/fjsj/evee/ (check fbLogin.js for created and app.html for constant and fb-root)
Bonus (how to serve a channel.html file with Meteor)
As of January 2013, Meteor does not support server-side routes to serve static HTML. So how to make a channel.html with Meteor? Putting it in /public won't work, since .html files are processed by Meteor as templates.
By using Meteor internals, it is possible! As suggested by this answer, we need to use a middleware-like approach (powered by Connect). Just put this on your /server (note it will be served at yourapp.meteor.com/fb/channel.html):
// serve channel.html file var connect = __meteor_bootstrap__.require("connect"); __meteor_bootstrap__.app .use(connect.query()) .use(function(req, res, next) { // Need to create a Fiber since we're using synchronous http // calls and nothing else is wrapping this in a fiber // automatically Fiber(function () { if (req.url === "/fb/channel.html") { res.writeHead(200, {'Content-Type': 'text/html'}); res.end('<script src="//connect.facebook.net/en_US/all.js"></script>'); } else { // not an channel.html request. pass to next middleware. next(); return; } }).run(); });
Also this is working in production and the code is available at GitHub (includes cache headers).