рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ OAuth 2.0-рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдпреЛрдЬрдирд╛

рдлреЗрд╕рдмреБрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрддреЗ рд╕рдордп, рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рджреЛрд╕реНрддреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА, рд╕рдорд╛рдЪрд╛рд░ рдлрд╝реАрдб, рд▓рд┐рдВрдХ, рдкрд╕рдВрдж рдЖрджрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдРрд╕реА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЗрд╖рдХ рд╕реЗ рд╕рд╣реА рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, FB рдиреЗ OAuth 2.0- рдЖрдзрд╛рд░рд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд┐рдХрд╕рд┐рдд рдХреА рд╣реИред



FB рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдпрд╛ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:



$ _REQUEST ['рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд_рд░реЗрдХреНрд╕реНрдЯ'] HMAC SHA-256, рдЕрд╡рдзрд┐ (ред) рдХреЗ рдЖрдзрд╛рд░ рдФрд░ рдмреЗрд╕ 64url рдореЗрдВ рдкреИрдХ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЗ JSON рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рд╕рднреА рдПрдХ рд╕рд╛рде):



 g2LAGH9BQ25BqO8-V5lP4Z74_DQ7U6AzWDGBpz-3yDg
 ред
 eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjAsIm9hdXRoX3Rva2VuIjoiMTI4ODI1OTA3MTYxMTc3fGNlNmM1NTUwNDEyNDlhOGU4NjlmOTVlOC0xMDAwMDEzMzM0ODk4ACR8ZVRzd1d4WjR5b2pkQ2dHU0dUcWx0NFpvBXlBLiIsInVzZXJfaWQiOiIxMDAwMDEzMzM0ODk4NDQifQ


FB рдХреЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рд╣реБрдП_рд░реЗрдХреНрд╡реЗрд╕реНрдЯ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ рдПрдХ рдмреАрдЯрд╛ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ):







рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрд╕рдХреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рдХреИрдирд╡рд╕ рдпреВрдЖрд░рдПрд▓ (рдЬрд╣рд╛рдВ рдПрдлрдмреА рд╕реЗ рдЖрд╡реЗрджрди рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ) рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВред рдРрд╕реЗ рд╕рдВрд╡рд╛рдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:



1. рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рддред



рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрдирдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░реЗрдВ:



 https://graph.facebook.com/oauth/authorize?
 client_id = рд╣рдорд╛рд░реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдИрдбреА
 & redirect_uri = рдЬрд╣рд╛рдВ рдЕрдиреБрдорддрд┐ рдХреЗ рдмрд╛рдж рдЬрд╛рдирд╛ рд╣реИ
 & рдЧреБрдВрдЬрд╛рдЗрд╢ = рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рдХреНрдпрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВ


рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ ред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЖрд╡рд╢реНрдпрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд_рдкреНрд░рддреНрдпреЗрдХ redirect_uri рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдПрдЧрд╛ред



2. FBJS рдореЗрдердб Facebook.showPermissionDialog ред



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (FBML рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп):



 Facebook.showPermissionDialog ('publish_stream, read_stream', рдХреЙрд▓рдмреИрдХ);


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдирдХ рдПрдлрдмреА рд╕рдВрд╡рд╛рдж рджреЗрдЦреЗрдВрдЧреЗред рдпрджрд┐ рдПрдХреНрд╕реЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рддреЛ рдХреЙрд▓рдмреИрдХ ('publish_stream, read_stream') рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛, рдХреЙрд▓рдмреИрдХ (рдЕрд╢рдХреНрдд);



3. рдЕрдЬрд╛рдХреНрд╕ ред



рдПрдлрдмреАрдЬреЗрдПрд╕ рдореЗрдВ рдПрдХ рдЕрдЬрд╛рдХреНрд╕ рд╡рд╕реНрддреБ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдкрддреНрддрд┐ рд╣реИред рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдкрд░ рдпрд╣ рд╕рддреНрдп рд╣реИ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрд╕рдХреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА ajax рдЕрдиреБрд░реЛрдз рд╕рдлрд▓ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:



 var рдЕрдЬрд╛рдХреНрд╕ = рдирдпрд╛ рдЕрдЬрд╛рдХреНрд╕ ();
 ajax.responseType = Ajax.FBML;
 ajax.ondone = function (data) {
	 рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (рдбреЗрдЯрд╛);
 }
 ajax.requireLogin = true;
 ajax.post ("http://example.com/processAjax.php");


рдпрд╣рд╛рдБ, рдкрд┐рдЫрд▓реЗ рдкрджреНрдзрддрд┐ рдХреА рддрд░рд╣, FB рд╕рдВрд╡рд╛рдж рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред FBJS рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ FBML рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, appAPPLICATIOPN_ID_ рд▓рд╛рдЗрди рдХреЛ рд╕рднреА рдЪрд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд var ajax var app12345390_ajax рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд▓рд░реНрдЯ app1234567890_alert рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рд╡реИрд╕реЗ рдХрдВрд╕реЛрд▓ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЦреНрдп рдбреАрдмрдЧрд░ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, FB рдиреЗ iframes рдФрд░ Javascript SDK рдХреЗ рдкрдХреНрд╖ рдореЗрдВ FBML рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ , рдЬреЛ рдЯреИрдм рдкрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░реЗрдЧрд╛ред



4. рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрд╕рдбреАрдХреЗ



рдЖрд╡реЗрджрди рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ FB.login рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 FB.login (рдлрд╝рдВрдХреНрд╢рди (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛) {
   рдЕрдЧрд░ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ред рд╕рддреНрд░) {
     // рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛
   } {
     // рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди рдХреЛ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛
   }
 });


рд╕рдВрд╡рд╛рдж рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреЙрдкрдЕрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред



рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕рдВрд╡рд╛рдж рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ:







рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд_рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред FB рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдлрд╝рдВрдХреНрд╢рди PHP SDK рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ):



 рдлрд╝рдВрдХреНрд╢рди parse_signed_request ($ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд, $ рдЧреБрдкреНрдд) {// $ рдЧреБрдкреНрдд - рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЧреБрдкреНрдд
   рд╕реВрдЪреА ($ рдПрдиреНрдХреЛрдбреЗрдб_рдПрд╕рдЖрдИрдЬреА, $ рдкреЗрд▓реЛрдб) = рд╡рд┐рд╕реНрдлреЛрдЯ ('ред', $ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд_рдХрд░рдирд╛, 2); 

   // рдбреЗрдЯрд╛ рдХреЛ рдбреАрдХреЛрдб рдХрд░реЗрдВ
   $ sig = base64_url_decode ($ рдПрдиреНрдХреЛрдбреЗрдб_sig);
   $ рдбреЗрдЯрд╛ = json_decode (base64_url_decode ($ рдкреЗрд▓реЛрдб), рд╕рддреНрдп);

   рдЕрдЧрд░ (strtoupper ($ рдбреЗрдЯрд╛ ['рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо'])! == 'HMAC-SHA256') {
     error_log ('рдЕрдЬреНрдЮрд╛рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдоред рдЕрдкреЗрдХреНрд╖рд┐рдд HMAC-SHA256');
     рд╡рд╛рдкрд╕реА;
   }

   // рдЪреЗрдХ рд╕рд┐рдЧ
   $ рдЕрдкреЗрдХреНрд╖рд┐рдд_рд╕рд┐рдЧ = рд╣реИрд╢_рд╣рдо ('sha256', $ рдкреЗрд▓реЛрдб, $ рдЧреБрдкреНрдд, $ рдХрдЪреНрдЪрд╛ = рд╕рддреНрдп);
   рдЕрдЧрд░ ($ sig! == $ рдЕрдкреЗрдХреНрд╖рд┐рдд_рд╕рд┐рдЧрд░) {
     error_log ('рдЦрд░рд╛рдм рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд JSON рд╣рд╕реНрддрд╛рдХреНрд╖рд░!');
     рд╡рд╛рдкрд╕реА;
   }

   $ рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рдПрдВ;
 }

 рдлрд╝рдВрдХреНрд╢рди base64_url_decode ($ рдЗрдирдкреБрдЯ) {
   // $ рдЗрдирдкреБрдЯ - base64url
   рд╡рд╛рдкрд╕реА base64_decode (рд╕реНрдЯреНрд░реЗрдЯ ($ рдЗрдирдкреБрдЯ, '-_', '+ /'));
 }


Parse_signed_request рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА рд▓реМрдЯрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрдХ рдХреБрдВрдЬреА oauth_reoken рд╣реЛрдЧреА ред рдЕрдЧрд▓рд╛, рдЖрдк рдЧреНрд░рд╛рдлрд╝ рдПрдкреАрдЖрдИ, рдУрд▓реНрдб рд░реЗрд╕реНрдЯ рдПрдкреАрдЖрдИ рдпрд╛ рдПрдлрдХреНрдпреВрдПрд▓ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:



 рдорд┐рддреНрд░: https: //graph.facebook.com/ID/friends? Access_token = ...
 рд╕рдорд╛рдЪрд╛рд░ рдлрд╝реАрдб: https: //graph.facebook.com/ID/home? Access_token = ...
 рджреАрд╡рд╛рд░: https: //graph.facebook.com/ID/feed? Access_token = ...


рдЯреИрдм рдкрд░ FBML рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рдмрд╛рдж, рдЖрдк рдХреЗрд╡рд▓ ajax рдЕрдиреБрд░реЛрдз рд╕реЗ user_id рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, user_id profile_id рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ (рджреЛрдиреЛрдВ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ (рдкреГрд╖реНрда) рдХреА рдЖрдИрдбреА рд╣реИрдВ), рдФрд░ oauth_token рдкреГрд╖реНрда рдкрд░ "рд╕рдВрд▓рдЧреНрди" рд╣реЛрдЧрд╛, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред



рд╕реМрднрд╛рдЧреНрдп рд╣реИ



All Articles