首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HybridAuth不使用ajax

HybridAuth不使用ajax
EN

Stack Overflow用户
提问于 2015-04-25 11:02:59
回答 1查看 1.2K关注 0票数 3

我正在尝试用ajax实现HybridAuth。

代码:

PHP:(将由ajax调用)

代码语言:javascript
复制
<?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:

代码语言: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无法加载token=123。请求的资源上没有“访问-控制-允许-原产地”标题。因此,“http://localhost”源是不允许访问的。

我知道,这意味着Twitter服务器不允许我的来源。有解决办法吗?使用ajax的“一页”signUp有可能吗?(希望是的--在quora.com上,它是有效的;)

TWITTERSETTINGS:

最佳法比安

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-27 09:03:06

首先,HybridAuth和ajax直接不起作用。但我现在有一个令人满意的解决方案,我想和你分享。我就是这样做的:

JavaScript:

代码语言: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:

代码语言:javascript
复制
<?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

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

说明:返回存储的userProfile。

摘要:

使用javascript打开一个弹出窗口,让用户授权应用程序。将数据存储在会话变量中。捕捉弹出窗口的关闭事件。然后进行ajax调用以检索存储的数据(会话)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29864311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档