document.write('<link rel="stylesheet" href="http://gist.github.com/stylesheets/gist/embed.css"/>')





document.write('<div id=\"gist-163784\" class=\"gist\">\n  \n  \n    \n            \n\n      <div class=\"gist-file\">\n        <div class=\"gist-data gist-syntax\">\n          \n          \n          \n            <div class=\"gist-highlight\"><pre><div class=\"line\" id=\"LC1\"><span class=\"k\">class<\/span> <span class=\"nc\">LiveServices<\/span><\/div><div class=\"line\" id=\"LC2\">&nbsp;&nbsp;<\/div><div class=\"line\" id=\"LC3\">&nbsp;&nbsp;<span class=\"c1\"># MSFT Live Services Application Information<\/span><\/div><div class=\"line\" id=\"LC4\">&nbsp;&nbsp;<span class=\"no\">LIVE_APP_ID<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s1\">&#39;development&#39;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s1\">&#39;XXX&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;staging&#39;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s1\">&#39;XXX&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;production&#39;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s1\">&#39;XXX&#39;<\/span><span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC5\">&nbsp;&nbsp;<span class=\"no\">LIVE_SECRET<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s1\">&#39;development&#39;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s1\">&#39;SHH&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;staging&#39;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s1\">&#39;SHH&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;production&#39;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s1\">&#39;SHH&#39;<\/span><span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC6\">&nbsp;&nbsp;<span class=\"no\">PRIVACY_URL<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s1\">&#39;development&#39;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s1\">&#39;http://privacy.com&#39;<\/span><span class=\"p\">,<\/span> <\/div><div class=\"line\" id=\"LC7\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"s1\">&#39;staging&#39;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s1\">&#39;http://privacy.com&#39;<\/span><span class=\"p\">,<\/span> <\/div><div class=\"line\" id=\"LC8\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"s1\">&#39;production&#39;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s1\">&#39;http://privacy.com&#39;<\/span><span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC9\">&nbsp;&nbsp;<span class=\"no\">DELEGATE_PATH<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">&quot;https://consent.live.com/Delegation.aspx&quot;<\/span><\/div><div class=\"line\" id=\"LC10\">&nbsp;&nbsp;<\/div><div class=\"line\" id=\"LC11\">&nbsp;&nbsp;<span class=\"c1\"># return_url  = Where the user is redirected to after authenticating on Live Services<\/span><\/div><div class=\"line\" id=\"LC12\">&nbsp;&nbsp;<span class=\"c1\"># permissions = Comma-separated string that lists the areas that you want access <\/span><\/div><div class=\"line\" id=\"LC13\">&nbsp;&nbsp;<span class=\"c1\">#               to (e.g. Contacts.View,Contacts.Update)<\/span><\/div><div class=\"line\" id=\"LC14\">&nbsp;&nbsp;<span class=\"k\">def<\/span> <span class=\"nc\">self<\/span><span class=\"o\">.<\/span><span class=\"nf\">new_auth_url<\/span><span class=\"p\">(<\/span><span class=\"n\">return_url<\/span><span class=\"p\">,<\/span> <span class=\"n\">permissions<\/span><span class=\"p\">,<\/span> <span class=\"n\">privacy_policy_url<\/span> <span class=\"o\">=<\/span> <span class=\"kp\">nil<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC15\">&nbsp;&nbsp;&nbsp;&nbsp;<\/div><div class=\"line\" id=\"LC16\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">privacy_policy_url<\/span> <span class=\"o\">||=<\/span> <span class=\"no\">PRIVACY_URL<\/span><span class=\"o\">[<\/span><span class=\"no\">RAILS_ENV<\/span><span class=\"o\">]<\/span><\/div><div class=\"line\" id=\"LC17\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">app_verifier<\/span> <span class=\"o\">=<\/span> <span class=\"n\">get_app_verifier<\/span><\/div><div class=\"line\" id=\"LC18\">&nbsp;&nbsp;&nbsp;&nbsp;<\/div><div class=\"line\" id=\"LC19\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">params<\/span> <span class=\"o\">=<\/span> <span class=\"o\">[[<\/span><span class=\"s2\">&quot;ru&quot;<\/span><span class=\"p\">,<\/span> <span class=\"no\">CGI<\/span><span class=\"o\">.<\/span><span class=\"n\">escape<\/span><span class=\"p\">(<\/span><span class=\"n\">return_url<\/span><span class=\"p\">)<\/span><span class=\"o\">]<\/span><span class=\"p\">,<\/span><\/div><div class=\"line\" id=\"LC20\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"o\">[<\/span><span class=\"s2\">&quot;ps&quot;<\/span><span class=\"p\">,<\/span> <span class=\"no\">CGI<\/span><span class=\"o\">.<\/span><span class=\"n\">escape<\/span><span class=\"p\">(<\/span><span class=\"n\">permissions<\/span><span class=\"p\">)<\/span><span class=\"o\">]<\/span><span class=\"p\">,<\/span><\/div><div class=\"line\" id=\"LC21\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"o\">[<\/span><span class=\"s2\">&quot;pl&quot;<\/span><span class=\"p\">,<\/span> <span class=\"no\">CGI<\/span><span class=\"o\">.<\/span><span class=\"n\">escape<\/span><span class=\"p\">(<\/span><span class=\"n\">privacy_policy_url<\/span><span class=\"p\">)<\/span><span class=\"o\">]<\/span><span class=\"p\">,<\/span><\/div><div class=\"line\" id=\"LC22\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"o\">[<\/span><span class=\"s2\">&quot;app&quot;<\/span><span class=\"p\">,<\/span> <span class=\"no\">CGI<\/span><span class=\"o\">.<\/span><span class=\"n\">escape<\/span><span class=\"p\">(<\/span><span class=\"n\">app_verifier<\/span><span class=\"p\">)<\/span><span class=\"o\">]]<\/span><\/div><div class=\"line\" id=\"LC23\">&nbsp;<\/div><div class=\"line\" id=\"LC24\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">auth_url<\/span> <span class=\"o\">=<\/span> <span class=\"no\">DELEGATE_PATH<\/span> <span class=\"o\">+<\/span> <span class=\"s2\">&quot;?&quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">params<\/span><span class=\"o\">.<\/span><span class=\"n\">collect<\/span> <span class=\"p\">{<\/span><span class=\"o\">|<\/span><span class=\"n\">x<\/span><span class=\"o\">|<\/span> <span class=\"n\">x<\/span><span class=\"o\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;=&quot;<\/span><span class=\"p\">)}<\/span><span class=\"o\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;&amp;&quot;<\/span><span class=\"p\">)<\/span>      <\/div><div class=\"line\" id=\"LC25\">&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC26\">&nbsp;&nbsp;<\/div><div class=\"line\" id=\"LC27\">&nbsp;&nbsp;<span class=\"c1\"># This method signs the key using your secret, application id, and a timestamp<\/span><\/div><div class=\"line\" id=\"LC28\">&nbsp;&nbsp;<span class=\"k\">def<\/span> <span class=\"nc\">self<\/span><span class=\"o\">.<\/span><span class=\"nf\">get_app_verifier<\/span><\/div><div class=\"line\" id=\"LC29\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">signkey<\/span> <span class=\"o\">=<\/span> <span class=\"no\">OpenSSL<\/span><span class=\"o\">::<\/span><span class=\"no\">Digest<\/span><span class=\"o\">::<\/span><span class=\"no\">SHA256<\/span><span class=\"o\">.<\/span><span class=\"n\">digest<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;SIGNATURE&quot;<\/span> <span class=\"o\">+<\/span> <span class=\"no\">LIVE_SECRET<\/span><span class=\"o\">[<\/span><span class=\"no\">RAILS_ENV<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span><span class=\"o\">[<\/span><span class=\"mi\">0<\/span><span class=\"o\">.<\/span><span class=\"n\">.<\/span><span class=\"mi\">15<\/span><span class=\"o\">]<\/span><\/div><div class=\"line\" id=\"LC30\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">token<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">&quot;appid=<\/span><span class=\"si\">#{<\/span><span class=\"no\">LIVE_APP_ID<\/span><span class=\"o\">[<\/span><span class=\"no\">RAILS_ENV<\/span><span class=\"o\">]<\/span><span class=\"si\">}<\/span><span class=\"s2\">&amp;ts=<\/span><span class=\"si\">#{<\/span><span class=\"no\">Time<\/span><span class=\"o\">.<\/span><span class=\"n\">now<\/span><span class=\"o\">.<\/span><span class=\"n\">to_i<\/span><span class=\"si\">}<\/span><span class=\"s2\">&quot;<\/span><\/div><div class=\"line\" id=\"LC31\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">signed_token<\/span> <span class=\"o\">=<\/span> <span class=\"no\">CGI<\/span><span class=\"o\">.<\/span><span class=\"n\">escape<\/span><span class=\"p\">(<\/span><span class=\"no\">Base64<\/span><span class=\"o\">.<\/span><span class=\"n\">encode64<\/span><span class=\"p\">(<\/span><span class=\"no\">OpenSSL<\/span><span class=\"o\">::<\/span><span class=\"no\">HMAC<\/span><span class=\"o\">.<\/span><span class=\"n\">digest<\/span><span class=\"p\">(<\/span><span class=\"no\">OpenSSL<\/span><span class=\"o\">::<\/span><span class=\"no\">Digest<\/span><span class=\"o\">::<\/span><span class=\"no\">SHA256<\/span><span class=\"o\">.<\/span><span class=\"n\">new<\/span><span class=\"p\">,<\/span> <span class=\"n\">signkey<\/span><span class=\"p\">,<\/span> <span class=\"n\">token<\/span><span class=\"p\">)))<\/span><\/div><div class=\"line\" id=\"LC32\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">app_verifier<\/span> <span class=\"o\">=<\/span> <span class=\"n\">token<\/span> <span class=\"o\">+<\/span> <span class=\"s2\">&quot;&amp;sig=<\/span><span class=\"si\">#{<\/span><span class=\"n\">signed_token<\/span><span class=\"si\">}<\/span><span class=\"s2\">&quot;<\/span><\/div><div class=\"line\" id=\"LC33\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">return<\/span> <span class=\"n\">app_verifier<\/span><\/div><div class=\"line\" id=\"LC34\">&nbsp;&nbsp;<span class=\"k\">end<\/span>    <\/div><div class=\"line\" id=\"LC35\"><span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC36\">&nbsp;<\/div><\/pre><\/div>\n          \n        <\/div>\n\n        <div class=\"gist-meta\">\n          <a href=\"http://gist.github.com/raw/163784/e690221403b6d517dc4952f81cfc308d6a88e718/Delegated%20Auth%20for%20MSFT%20Live%20Services%20in%20Ruby.rb\" style=\"float:right;\">view raw<\/a>\n          <a href=\"http://gist.github.com/163784#file_delegated auth for msft live services in ruby.rb\" style=\"float:right;margin-right:10px;color:#666\">Delegated Auth for MSFT Live Services in Ruby.rb<\/a>\n          <a href=\"http://gist.github.com/163784\">This Gist<\/a> brought to you by <a href=\"http://github.com\">GitHub<\/a>.\n        <\/div>\n      <\/div>\n    \n  \n<\/div>\n')
