Facebook oAuth с Phonegap 2.3.0 не возвращает токен в качестве параметра URL-адреса при успешном URL-адресе

Я пытаюсь интегрировать Facebook oAuth с моим приложением Phonegap 2.3.0, чтобы я мог публиковать сообщения на стене пользователя. Я могу использовать библиотеку отсюда: Phonegap oauth с некоторыми изменениями для учетной записи для дочернего браузера. называется InAppBrowser и является частью ядра Phonegap — см. ниже.

function FBConnect()
{
    this.facebookkey = 'facebook';
    this.childBrowser = null;
}

FBConnect.prototype.connect = function(options)
{
    this.client_id = options.consumerKey;
    this.client_secret = options.consumerSecret
    this.redirect_uri = options.callbackUrl;
    oauth = OAuth(options);
    var authorize_url  = "https://m.facebook.com/dialog/oauth?";
        authorize_url += "client_id=" + this.client_id;
        authorize_url += "&redirect_uri=" + this.redirect_uri;
        authorize_url += "&display=touch";
        authorize_url += "&response_type=token";
        authorize_url += "&type=user_agent";
        authorize_url += "&scope=email,read_stream,publish_stream";

    var self = this;
    self.childBrowser = window.open(authorize_url, '_blank', 'location=no');
    self.childBrowser.addEventListener('loadstart', function(event){ console.log('event fired: '+event);self.onLocationChange(event.url);});
}

FBConnect.prototype.onLocationChange = function(loc)
{

    console.log("onLocationChange : " + loc);

    // If user hit "No, thanks" when asked to authorize access
    if (loc.indexOf("login_success.html?error_reason=user_denied") >= 0) {
        this.childBrowser.close();
        return;
    }

 // here we get the code
    if (loc.indexOf("access_token") >= 0) {

        var access_token = loc.match(/access_token=(.*)$/)[1];
        console.log("facebook token" + access_token); 
        window.localStorage.setItem(window.plugins.fbConnect.facebookkey, access_token);
        this.childBrowser.close();
        this.onConnect();
    }
}

Я могу открыть InAppBrowser, чтобы отправить пользователя на страницу авторизации. Пользователь сначала входит в систему со своей учетной записью Facebook, затем видит страницу приложения, и когда он нажимает «ОК», он может предоставить доступ, за которым следует экран разрешений. Затем пользователь предоставляет разрешения моему приложению и затем отправляется на callbackUrl, установленный как: http://www.facebook.com/connect/login_success.html. Однако на данном этапе я ожидаю, что токен будет прикреплен к URL-адресу в качестве параметра запроса. В URL ничего нет.

Я что-то упускаю?


person M Azam    schedule 05.05.2013    source источник


Ответы (1)


Я делаю это так, и это работает для меня, так как я получаю параметр URL-адреса code при перенаправлении:

openFBLogin : function() {
    var my_client_id  = Properties.FB_APP_ID,
    my_redirect_uri   = "http://www.myweb.com?fb_redirect=tabapp",
    my_display        = "touch";

    var authorize_url  = "https://graph.facebook.com/oauth/authorize?";
    authorize_url += "client_id="+my_client_id;
    authorize_url += "&redirect_uri="+my_redirect_uri;
    authorize_url += "&display="+my_display;
    authorize_url += "&scope=publish_actions%2Cuser_birthday%2Cuser_interests%2Cuser_likes%2Cuser_location%2Cuser_relationships%2Cemail%2Cuser_checkins%2Cuser_hometown%2Cpublish_stream";
    Helper.iabRef = window.open(authorize_url, '_blank', 'presentationstyle=formsheet');
    Helper.iabRef.addEventListener('loadstop', Helper.iabFBLoginLoadStop);
    Helper.iabRef.addEventListener('loadstart', Helper.iabFBLoginLoadStart);
    console.log(Helper.iabRef);
},
iabFBLoginLoadStart : function(event){
    Helper.onUrlChange(event.url);
},
iabFBLoginLoadStop : function(event){
    Helper.onUrlChange(event.url);
},
/**
 * Given the FB redirection URL it will check it for success/failure
 * If success it will do login else dump error message before closing the browser window
 * @param {} url
 */
onUrlChange : function(url){
    var error = null;
    if(url.indexOf("http://www.myweb.com") == 0){
        // User is redirected that means FB job is done
        if(/code=/.test(url)){
            // If Code param is available that means authentication done
            var fbCode = url.match(/code=(.*)$/)[1];
            console.log("logged in with fbCode = "+fbCode);
            // TODO call login service with this code and
            // on success save user credentials returned by service
        } else if(/error_description=/.test(url)) {
            // if error_description param is present that means login unsuccessful
            error = (url.match(/error_description=(.*)$/)[1]).replace(/[^A-Za-z0-9 ]/g, " ");
            console.log("Error message : "+error);
        }

        if(Helper.iabRef){
            Helper.iabRef.close();
        }
    }
    if(error){
        Ext.Msg.alert('Error','Unable to login using facebook : '+error);
    } else{
        Ext.Msg.alert('Success','Thanks for logging in');
    }
},
person ThinkFloyd    schedule 06.05.2013
comment
Я предполагаю, что http://www.myweb.com?fb_redirect=tabapp — это просто псевдо-URL, который вы используете для перехвата в обработчике событий для loadstart, верно? Я действительно не хочу использовать URL-адрес успеха Facebook, поскольку он имеет красное предупреждение для пользователя - не самое удобное для пользователя поведение. - person M Azam; 06.05.2013
comment
Да, это URL-адрес пустой страницы на моем веб-сайте, при переходе по этому URL-адресу я читаю код с URL-адреса и закрываю окно браузера. - person ThinkFloyd; 07.05.2013
comment
Это очень важно для того, чтобы этот процесс работал. Если у вас есть какие-либо перенаправления в URL-адресе обратного вызова, токен будет потерян, поскольку он не распространяется в перенаправлениях, а конечный URL-адрес, на который вы попадете, не будет иметь токен в строке запроса. - person M Azam; 13.05.2013