Вопрос по facebook-c#-sdk, facebook – Как безопасно передавать Facebook Id с клиента на сервер

8

У меня есть приложение на холсте Facebook. Я использую JS SDK для аутентификации пользователя на стороне браузера и запрашиваю различную информацию через FB.api (например, имя, друзья и т. Д.).

Я также хочу сохранить некоторую дополнительную пользовательскую информацию (не хранится в Facebook) в базе данных на моем сервере, выполнив вызов ajax:

{ userFavouriteColour: "Red" }

Чтобы сохранить это на сервере и связать с нужным пользователем, мне нужно знать идентификатор Facebook, и это представляет проблему. Как передать UID с клиента на сервер.

Option 1: Add uid to the ajax request:

{ uid: "1234567890",
  userFavouriteColour: "Red" }

Это явно не хорошо. Любой может сделать запрос ajax на мой веб-сервис с использованием чужого идентификатора Facebook и изменить свой любимый цвет.

Option 2: On the server, extract the uid from a cookie: Is this even possible? I have read that Facebook sets a cookie containing the uid and access token but do I have access to this cookie on my domain? More importantly, can I securely Извлеките UID из cookie-файла или он открыт для подмены, как вариант 1.

Option 3: User server-side authentication on the server: I could use the server-side authentication to validate the user identity on my server. But will this work if I am already using client-side authentication on the browser? Will I end up with two different access tokens? I would like to make FB.api requests from the browser so I need the access token on the client (not just on the server).

Это должно быть очень распространенным сценарием, поэтому я думаю, что мне не хватает чего-то фундаментального. Я прочитал много документации Facebook (различные потоки аутентификации, токены доступа, signature_request и т. Д.) И много постов в SO, но я все еще не понимаю, как аутентификация на стороне клиента и аутентификация на стороне сервера хорошо сочетаются друг с другом.

In short, I want to know the user's identity on the server but still make requests to the Facebook api from the client browser?

(Я использую ASP.NET и Facebook C # SDK на сервере)

EDIT: Добавлена награда. Я надеялся получить более точную, официальную рекомендацию о том, как справиться с этой ситуацией, или даже пример. Как уже было сказано, я уже прочитал много официальных документов FB по потокам аутентификации, но я все еще не могу найти ничего определенного о том, как аутентификация на стороне клиента и на стороне сервера работают вместе.

Ваш Ответ

4   ответа
3

Option 1: Самым простым способом, который я могу придумать, является включение accessToken в JS и передача его с помощью вызова ajax.

Option 2: Используя то же, что и в варианте 1, но вместо отправки только accessToken отправьте подписанный запрос.

На стороне сервера вы можете расшифровать его, используя (TryParseSignedRequest метод), который даст вамUserID :-)

Замечания:signedRequest шифруется приложением Secret.you are the only one who should know it, so you are safe on that end.

Отказ от ответственности:

У меня нет опыта программирования на C #, но небольшой поиск в Google дал мне это:

Facebook C # SDK для ASP.NET

Выполнение AJAX-запросов с помощью Facebook C # SDK

Error: User Rate Limit Exceeded njr101
Error: User Rate Limit Exceededdevelopers.facebook.com/docs/reference/javascript/…Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded njr101
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded njr101
0

Я не знаю, зависит ли это от конкретного языка, но использование аутентификации как на стороне сервера, так и на стороне клиента не причиняет вреда.

Вы можете работать над вариантом 2, но да, это также будет уязвимо для подмены.

При выборе варианта 3 у вас будет один токен доступа для этого сеанса пользователя, так что, по моему мнению, это будет лучший выбор, поскольку у вас всегда есть возможность подделки при передаче пользовательской информации со стороны клиента.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded njr101
1

Это на самом деле очень просто.

Когда пользователь загружает ваше приложение, используйтеаутентификация на стороне сервераполучите токен доступа и загрузите данные пользователя, выполнив запрос API с сервера.
На стороне сервера у вас будет все, что вам нужно, и он будет помещен в «песочницу».

Когда страница отображается для пользователя, используяJS SDK получить данные аутентификации пользователя, вы должны быть в состоянии использоватьFB.getLoginStatus поскольку пользователь уже прошел аутентификацию на стороне сервера.
Теперь на стороне клиента у вас также есть токен доступа, который вы можете использовать для получения пользовательских данных из графа API.

Эти два токена будут отличаться и также будут иметь различный срок действия, но это не должно быть проблемой, оба токена должны работать должным образом, как вы ожидаете.
Поскольку обе стороны имеют свой собственный токен и способ делать запросы к API, нет необходимости отправлять между ними какие-либо fb-данные.

Таким образом, третий вариант, который вы упомянули для меня, звучит лучше всего, и реализовать его тоже очень просто.


Edit

Все SDK facebook являются просто оболочками для http-запроса, так как весь fb api сделан на http-запросах.
Пакеты SDK предоставляют вам простой и более короткий доступ к данным без необходимости создавать URL-адрес самостоятельно (со всеми возможными параметрами), выполнять запрос и анализировать ответ.

Честно говоря, я думаю, что прекращение предоставления CK SDK способа поддержки аутентификации на стороне сервера - очень плохое решение.
Какой смысл предоставлять SDK, который не реализует весь API?

Исходя из моего опыта, лучшим ответом на ваш вопрос является использование аутентификации как на стороне сервера, так и на стороне клиента, а поскольку C # SDK не поддерживает ее, я советую вам создать собственный SDK.
Это совсем не сложно, я уже реализовал это для python и java (дважды), и, поскольку вы будете разрабатывать его для своих собственных нужд, он может быть адаптирован для ваших конкретных нужд, в отличие от общедоступного SDK, который должен поддерживать все возможные опции.


2nd Edit

Нет необходимости создавать полностью новый SDK, вы можете просто «продлить» те, которые вы используете, и добавьте недостающие части, которые вам нужны, например, поддержку аутентификации на стороне сервера.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededblog.prabir.me/post/…Error: User Rate Limit Exceeded njr101
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded njr101
Error: User Rate Limit Exceeded njr101
0

У меня был точно такой же вопрос недавно. Это вариант 2. Проверьтеэта почта из блога Facebook.

Честно говоря, я не настолько хакер, чтобы знать, не могли бы вы подделать UID в cookie, но это, похоже, «официальный» вариант. способ сделать это.

РЕДАКТИРОВАТЬ: на другой вопрос по варианту 2, да, я считаю, что вы должны получить доступ к этому cookie на вашем домене.

Error: User Rate Limit ExceededhereError: User Rate Limit ExceededgetUserFromAvailableDataError: User Rate Limit Exceededsigned_requestError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded njr101
Error: User Rate Limit Exceeded njr101

Похожие вопросы