2016-08-04 2 views
1

Facebook документации говорится, чтоНе работает Xamarin.Auth 1.3 с помощью Facebook OAuth?

App Secret или маркер App Access никогда не должны быть включены в любой код, который может быть доступ к любым другим, чем разработчик приложения. Это относится ко всем методам кода, которые не защищены как клиентский код (например, HTML или Javascript) или собственные приложения (например, iOS, Android или настольные приложения Windows), которые можно декомпилировать. https://developers.facebook.com/docs/facebook-login/security#appsecret

По этой причине, если ваш «Тип App» в разделе Дополнительные настройки в App Dashboard устанавливается в Native/Desktop мы предполагаем, что ваше родное приложение содержит App Secret или токен App Access в двоичном, и не позволяют выполнять вызовы, подписанные с помощью токена доступа к приложениям. API будет вести себя так, как если бы не был предоставлен токен доступа.

Поэтому, если вы вставляете App Secret в свое приложение и рассказываете об этом в Facebook, он просто перестанет работать с OAuth (я также проверил это, когда вы проверяете этот параметр, Facebook перестает проверять секрет).

но Xamarin.Auth 1,3 (последняя стабильная) требует clientSecret (в классе OAuth2Authenticator clientSecret является обязательным параметром) и использует его для получения маркера доступа Facebook, когда пользователь успешно входит в систему.

Так это ошибка, это там обходной путь, или Xamarin.Auth сейчас бесполезен с Facebook?

+0

я добавил отдельный ответ для вас с не- * ClientSecret * основанный конструктор ... Рад, что вы получили его работу ;-) – SushiHangover

ответ

1

OAuth2Authenticator содержит несколько конструкторов и есть один, который не требует ClientSecret:

public OAuth2Authenticator (string clientId, string scope, Uri authorizeUrl, Uri redirectUrl, GetUsernameAsyncFunc getUsernameAsync = null) 

Это один позволит OAuth2 неявный поток и, следовательно, не нуждается секрет клиента должны храниться в коде приложения.

Ref: https://github.com/xamarin/Xamarin.Auth/blob/9c19d90e52994188def9e12e0bbc981a3943a752/src/Xamarin.Auth/OAuth2Authenticator.cs#L110

1

Не будем путать вещи. Это не имеет никакого отношения к Xamarin.Auth.

Есть два основных варианта OAuth2:

  1. неявный поток
  2. Код авторизации потока

неявный поток делает не требует секрет клиента. Неявный поток обычно используется с мобильными приложениями, поскольку они не могут хранить тайну (вы можете разобрать бинарное приложение и найти секрет). То же самое происходит с Javascript или настольными приложениями. Единственный способ защитить секрет: если он хранится на сервере, к которому нельзя получить доступ третьими лицами (= пользователи).

В потоке кода авторизации используется секрет клиента как additional protection, секрет идентифицирует определенную сторону, например сервер.

А что такое Facebook? Говорят, что если вы настроите приложение как родное/настольное приложение на панели инструментов Facebook, они предполагают (!), Что вы храните секрет в двоичном формате, потому что: где еще он будет идти? Как следствие, секрет больше не является реальным секретом, поэтому API Facebook действует так, как будто этого не было.

Два решения:

  • Либо настроить приложение, как не родной/рабочий стол (я не знаю, какой термин использует Facebook, может быть, «Сервер»)
  • или использовать неявный поток который был разработан для мобильных клиентов.

И чтобы ответить на ваш первоначальный вопрос: да, Xamarin.Auth поддерживает OAuth2 от Facebook, потому что он точно так же, как и любой другой OAuth2.

+0

Спасибо, но я спрашиваю, почему Xamarin.Auth требует, чтобы вы вставляли секрет клиента в приложение и как он может быть безопасным и поддерживать ваше приложение (если вы настроите приложение как родное в Facebook, поток Oauth, который использует Xamarin.Auth, перестанет работать, секретная проверка не удастся) и если вы не станете жертвой своего секрета (как это будет в двоичных файлах, которые пользователи могут разобрать и т. д.), скажите, пожалуйста, об этом, если вы знаете ответ ... – Bob

+0

Этого не может. Если вы включаете секрет клиента в мобильное приложение, он не защищен и не секрет. Однако никто не останавливает вас от этого. Для потока * implicit * вам не нужен секрет клиента. Facebook не обнаруживает, что ваше приложение содержит секрет клиента. Они проверяют: настраивается ли приложение как родное/настольное/мобильное приложение? Если да, пытается ли он использовать секрецию клиента? Если да, не принимайте, потому что это не считается секретом. – Krumelur

+2

@Bob Я думаю, что некоторые из путаницы могут заключаться в том, что вы используете неправильный конструктор, используйте один без * обязательного * 'ClientSecret':' public OAuth2Authenticator (string clientId, строка scope, Uri authorizeUrl, Uri redirectUrl, GetUsernameAsyncFunc getUsernameAsync = null) ': https: //github.com/xamarin/Xamarin.Auth/blob/9c19d90e52994188def9e12e0bbc981a3943a752/src/Xamarin.Auth/OAuth2Authenticator.cs#L110 – SushiHangover

Смежные вопросы