HybridAuth не работает с ajax

Я пытаюсь реализовать HybridAuth с ajax.

Код:

PHP: (будет вызван ajax)

<?php header('Content-type: application/json'); $provider = $_GET["provider"]; $config = '../libaries/hybridauth/config.php'; require_once( "../libaries/hybridauth/Hybrid/Auth.php" ); try { $hybridAuth = new Hybrid_Auth($config); $adapter = $hybridAuth->authenticate($provider); $userProfile = json_encode($adapter->getUserProfile()); echo $_GET['callback'] . '(' . "{$userProfile}" . ')'; } catch (Exception $e) { echo "Ooophs, we got an error: " . $e; } ?> 

Javascript:

 socialRegister: function () { var self = this; var val = 'provider=' + self.get("provider"); return $.ajax({ type: "GET", url: path.urlRoot + 'ext/socialRegisterAndAuthentication.inc.php', dataType: "jsonp", data: val }); } 

Но я всегда получаю следующую ошибку:

XMLHttpRequest не может загрузить https://api.twitter.com/oauth/authenticate?oauth_token=123 . В запрошенном ресурсе нет заголовка «Access-Control-Allow-Origin». Происхождение ' http: // localhost ', следовательно, не допускается.

Я знаю, что это означает, что сервер Twitter не позволяет мне происходить. Есть ли обходной путь? Возможно ли «одностраничное» соглашение с ajax? (Надеюсь, да – на quora.com это работает;))

TWITTERSETTINGS: введите описание изображения здесь

Лучший фабиан

Прежде всего – HybridAuth и ajax напрямую не работают. Но теперь у меня есть удовлетворительное решение, и я хочу поделиться им с вами. Итак, вот как я это сделал:

JavaScript:

 twitterRegister: function () { var self = this; self.popupWindow = window.socialPopupWindow = window.open( path.urlRoot + 'ext/socialRegisterAndAUthentication.inc.php?provider=Twitter', "hybridauth_social_sing_on", "location=0,status=0,scrollbars=0,width=800,height=500" ); var winTimer = setInterval(function () { if (self.popupWindow.closed !== false) { // !== is required for compatibility with Opera clearInterval(winTimer); //Now twitter register from require(["model/register"], function (registerModel) { var registerM = new registerModel(); var ajaxRequest = registerM.socialRegister(); $.when(ajaxRequest).done(function (response) { console.log(response); self.slideOutRegister("Twitter"); self.twitterObject = response; $('#reg_user').val(response.firstName); }); $.when(ajaxRequest).fail(function () { self.slideOutRegister("Email"); }); }); } }, 200); }, 

Объяснение: Эта функция открывает новое всплывающее окно. Пользователю будет предложено авторизировать приложение. SetInterval улавливает событие закрытия (запускается самим окном, когда оно завершено).

socialRegisterAndAUthentication.inc.php:

 <?php session_start(); header('Content-type: text/html'); $provider = $_GET["provider"]; $config = '../libaries/hybridauth/config.php'; require_once( "../libaries/hybridauth/Hybrid/Auth.php" ); try { $hybridAuth = new Hybrid_Auth($config); $adapter = $hybridAuth->authenticate($provider); $_SESSION["userProfile"] = json_encode($adapter->getUserProfile()); echo "<script type='text/javascript'>"; echo "window.close();"; echo "</script>"; } catch (Exception $e) { echo "Ooophs, we got an error: "; } ?> 

Объяснение: Закрывает окно, когда выполняется авторизация (это из документов HybridAuth). Данные хранятся в сеансе, поэтому я могу получить его позже на ajax.

getSocialData.inc.php

 <?php session_start(); header('Content-type: application/json'); echo $_GET['callback'] . '(' . "{$_SESSION["userProfile"]}" . ')'; ?> 

Объяснение: Возвращает сохраненный пользовательский файл.

Резюме:

Откройте всплывающее окно с javascript и разрешите пользователю авторизовать приложение. Храните данные в переменной сеанса. Поймайте событие закрытия всплывающего окна. Затем сделайте ajax-вызов для извлечения сохраненных данных (сеанса).