Как е защитено влизането само във Facebook на родния клиент, ако никога не изпращате тайната на клиента си, за да получите токен за достъп?

Когато интегрирате Facebook Login в приложението си, по същество има 2 (добре, има повече от 2, но за този въпрос съм загрижен само за тези 2) начина да получите токен за достъп:

  1. Накарайте FB да върне код на приложението ви, който след това да обмените за токен за достъп НА ВАШИЯ СЪРВЪР, като добавите вашата клиентска тайна. Клиентът извършва обаждане по следния начин, https://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=code и след това сървърът, обработващ URI за пренасочване, предава кода и тайната на клиента на FB, за да получи токен за достъп.
  2. Накарайте 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, които изпращат токен директно на клиента, без да изискват каквато и да е защитена от страна на сървъра тайна, могат да бъдат сигурни.


person adevine    schedule 02.02.2015    source източник


Отговори (1)


Това е по-малко сигурен начин за транспортиране на токени за достъп до клиенти. Спецификацията на OAuth потвърждава това изрично в раздел 10.3 (https://tools.ietf.org/html/rfc6749#section-10.3) и повече в раздел 10.16 (https://tools.ietf.org/html/rfc6749#section-10.16).

Смисълът на този последен раздел е, че наистина не можете да се доверите, че собственикът на ресурса наистина ви е дал токена за достъп, така че никога не трябва да излагате повече информация чрез вашия клиент, различна от информацията, до която токенът за достъп ви позволява достъп.

Обърнете внимание, че страната, която ви е дала токена за достъп, очевидно може да се сдобие с тази информация сама, тъй като се е сдобила с токена за достъп, така че няма проблем при разкриването на тази информация чрез вашия клиент. Просто не предполагайте, че вие ​​се излагате на собственика на ресурса.

Неявният поток е защитен в обхвата на спецификацията OAuth - делегиран контрол на достъпа, не може да се използва за удостоверяване на потребители.

person Hans Z.    schedule 02.02.2015
comment
Благодаря! Все още обаче не съм наясно как това е защитено с имплицитно разрешение: 1. Да предположим, че съм Facebook и искам да дам на TrustedAppDeveloper възможността да публикува актуализации на състоянието от името на потребителите. 2. TrustedAppDeveloper идва и регистрира тяхното приложение, а аз (като FB) потвърждавам, че са добри. 3. Какво пречи на BadAppDeveloper да създаде мобилно приложение, което зарежда уеб изглед за достъп до fb.com/dialog/ и след това да публикувате спам съобщения в емисията на потребителя (и сега ИЗГЛЕЖДА, че спамът идва от TrustedAppDev)? - person adevine; 03.02.2015
comment
предпоставката е, че потребителят не инсталира приложение от BadAppDeveloper, защото или магазинът за приложения ще го филтрира, или самият потребител ще го разпознае като злонамерено приложение; прав си, че това е слабото място - person Hans Z.; 03.02.2015