Когато интегрирате Facebook Login в приложението си, по същество има 2 (добре, има повече от 2, но за този въпрос съм загрижен само за тези 2) начина да получите токен за достъп:
- Накарайте FB да върне код на приложението ви, който след това да обмените за токен за достъп НА ВАШИЯ СЪРВЪР, като добавите вашата клиентска тайна. Клиентът извършва обаждане по следния начин, https://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=code и след това сървърът, обработващ URI за пренасочване, предава кода и тайната на клиента на FB, за да получи токен за достъп.
- Накарайте FB да върне токен за удостоверяване ДИРЕКТНО към вашето приложение в URL адреса за пренасочване: https://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=token . В този случай токенът се връща директно на клиента в URL фрагмент.
(Информацията по-горе е взета от https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/v2.2 )
По този начин въпросът ми е как вторият метод, при който FB връща токен директно, е сигурен, когато никога не е трябвало да доказвате, че клиентът е този, за когото се представя? Токените, върнати във втория случай, имат ли по-малко разрешения от първия случай? Знам, че в мрежата по подразбиране клиентите имат кратък живот (напр. 2-часови токени), но ако използвате SDK за Android или iOS, получавате дълготрайни токени, въпреки че никога не предавате клиентска тайна. По този начин, свързан въпрос е как SDK на Facebook за Android и iOS могат наистина да са сигурни, че клиентското приложение е това, за което се представя (клиентското приложение винаги може да бъде разглобено и някой може да открадне всяка информация, която доставяте в приложението)?
По същество се опитвам да разбера как потоците oauth, които изпращат токен директно на клиента, без да изискват каквато и да е защитена от страна на сървъра тайна, могат да бъдат сигурни.