Я посмотрел ваш javascript и увидел пару вещей, которые вы должны проверить:
Когда вы инициализируете javascript SDK, вы устанавливаете cookie = false и status = false. Большинство примеров, которые я видел, устанавливают это как true. Это может не иметь ничего общего с 5% -ными исключениями, которые вы видите, но я не понимаю, как было бы вредно установить их в значение true, и это могло бы помочь. Попробуйте и посмотрите, имеет ли это значение.
Большая проблема, которую я вижу, заключается в том, что ваш код предполагает, что разрешения предоставлены. Вам действительно нужно проверить объект ответа в обратном вызове FB.login. Пользователь, возможно, не вошел в систему, и он, возможно, отказал в некоторых разрешениях. Вам нужно проверить объект ответа, чтобы увидеть, есть ли в нем ошибка.
Вам нужно будет запросить таблицу разрешений (fql) или выполнить команду get / me / permissions, чтобы узнать, какие разрешения они предоставили. Было бы неплохо, если бы объект ответа на обратный вызов FB.login сообщал вам, что было предоставлено или отказано, но это не так.
Также я считаю, что есть случаи, когда у людей нет электронной почты, зарегистрированной в Facebook или в другом месте.
Подводя итог: вы не можете доверять тому, что вы получите то, о чем просите, вам нужно проверить объект ответа и изящно обработать исключения, повторно выполнив проверку подлинности с сообщением, указывающим, почему вы повторяете запрос.
Еще одна вещь, которую вы, возможно, захотите рассмотреть, - это средство ведения журнала на стороне клиента, такое как log4javascript (или сверните свое собственное), которое собирает дополнительную информацию об этих исключениях. Например, может быть шаблон для конкретного браузера, который плохо обрабатывает вещи.