Jump to content
php.lv forumi

FaceBook autorizācijas drošība


Recommended Posts

Sveiki,

 

tātad ir sistēma, nu saukšu viņu par DB kurai slēdzas klāt caur SOAP un ir WEB lapa kurā ievadot lietotāju un paroli pieprasījums tiek pārsūtīts uz DB un ja ar lietotāju un paroli viss OK, tad cilvēks ielogojas un tiek pie visādiem saviem datiem.

 

Uzdevums ir šiem te lietotājiem iespēju sasaistīt savu kontu ar facebook. Nu idejiski lietotājs dabū savu FB tokenu, WEB dabū FB lietotāja ID un šos ten esošos lietotājus DB sasaistam pēc facebook ID. Gribētu saprast vienu lietu, kā pareizi risināt. Ir tā ka WEB pusei tā īsti es nedrīksu uzticēties un atķļaut WEB serverim tikai pēc FB ID atgriezt lietotāja datus, jo piemēram ja kāds uzlauž to WEB tad diezgan brīvi varētu zinot tikai FB ID iegūt lietotāja datus. Kautkādā veidā vajadzētu DB validēt ka tiešām šis te lietotājs ir autorizējies FB.

 

Mana doma ir tā, kad WEB pieprasa lietotāja datus no DB, tad kopā ar SOAP pieprasījumu tiek nodots arī lietotāja tokens un FB ID, un DB vēlreiz sūta pieprasījumu uz FB API ar šo te tokenu un pieprasa lietotāja ID, ja lietotāja ID sakrīt un nav nekādu kļūdu no FB puses, tad lietotājs ir autorizējies FB.

 

Domāju ka mans gadījums nav nekas unikāls un negribas nekādu divriteni izgudrot pa jaunu. Kāda ir prakse šādos gadījumos ?

 

Pats es to WEB nekodēju, bet vajag saprast kā pareizi droši tur visu sataisīt.

 

 

 

 

Link to post
Share on other sites

1) sūti autorizācijas pieprasījumu uz FB un dabū autorizācijas urli (server->fb)

2) lietotājs tiek redirektēts uz FB autorizāciajs urli, tur tiek autorizēts and atgriezts uz tavu lapu ar access tokenu

3) Izmanto access tokenu lai iegūtu no FB lietotaja datus (FB ID) (server->fb)

4) Atrodi savā datubāzē registrētu leitotāju ar šādu FB ID un autorizē savā sistēmā

 

pa lielam jau domā pareizi

Link to post
Share on other sites

problēma ir ar 

 

4) Atrodi savā datubāzē registrētu leitotāju ar šādu FB ID un autorizē savā sistēmā

 

jo īsti nevaru ticēt WEB, jo negribu atgriest datus tikai pēc FB ID jo WEB neuzticos.

 

gribu lai WEB sūtot pieprasījumu DB iekļautu arī lietotāja tokenu, tad DB sūtītu uz FB jaunu pieprasījumu un pārbaudītu, vai šādam tokenam atbilst konkrēts FB ID.

 

tas tamdēļ, ka īsti WEB nedrīkstu uzticēties un jautājums ir vai ar manu domu tur viss ir OK.

Link to post
Share on other sites

Ar tavu domu neok ir tas, ka tu pārāk daudz iedziļinies.

 

Ja tu dabū no klienta FB tokenu, pēc kura FB iedod usera id, tad tas ir valīds, viss, aizmirsti pārējo.

Link to post
Share on other sites

Ar tavu domu neok ir tas, ka tu pārāk daudz iedziļinies.

 

Ja tu dabū no klienta FB tokenu, pēc kura FB iedod usera id, tad tas ir valīds, viss, aizmirsti pārējo.

 

Runa ir par to ja WEB uzhako, tad var dabūt visus lietotāja datus zinot tikai FB id.

 

Tb WEB sūta uz DB SOAP pieprasījumu ar FB ID un DB atgriež usera datus. Manā gadījumā tas nederēs, man jāzin DB pusē, vai kāds hakeris nesūta feiku pieprasījumu ar FB ID nemaz neautorizējies FB. Tādēļ es domāju validēt šo te FB tokenu no DB puses. 

Link to post
Share on other sites

Facebook JS uzseto cookie. Backendā tu izmanto Facebook PHP API, lai darītu kaut ko šādu:

	public static function facebookLogin()
	{
		$fb = new Facebook(
			[
				'app_id'     => Config::get('app.facebook-auth.app-id'),
				'app_secret' => Config::get('app.facebook-auth.secret'),
			]
		);
		$helper = $fb->getJavaScriptHelper();
		$accessToken = $helper->getAccessToken();
		$response = $fb->get('/me?fields=name', $accessToken);
		$user = $response->getGraphUser();
		
		$localUser = Database::get()
			->prepare('SELECT id, name FROM users WHERE facebook_id = ?')
			->execute([$user->getId()])
			->fetchRow();
		
		if (empty($localUser))
		{
			$id = Database::get()
				->prepare('INSERT INTO users (name, facebook_id) VALUES (?, ?)')
				->execute([$user->getName(), $user->getId()])
				->getLastInsertId();
		}
		else
		{
			$id = $localUser['id'];
			// update the name to the latest version whenever the user logs in
			if ($localUser['name'] !== $user->getName())
			{
				Database::get()
					->prepare('UPDATE users SET name = ? WHERE id = ?')
					->execute([$user->getName(), $id]);
			}
		}
		// šis uzseto PHP sesiju
		self::set(
			'user',
			[
				'id'    => $id,
				'fb_id' => $user->getId(),
				'name'  => $user->getName(),
			]
		);
	}

Attiecīgi, ja kaut kas ar to cookie ir šķībi, tad Facebook API metīs exception.

Edited by jurchiks
Link to post
Share on other sites

SOAP is stateful kurā tu sūti līdzi savu autorizēto sessiju. Autorizēt sessiju savukārt būtu jāvar caur FB vai email/pass, kas būtu atsevišks mehanisms.

Tieši tā pat kā strādā parastais webs. Neviens kukijos neglabā FB ID un neatorizē lietotāju sessiju pēc ši FB ID, bet glabā autorizētas SESSIJAS ID

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...