Facebook Richiede l’autorizzazione: publish_actions

Io sono nel processo di sviluppo di un Concorso e di Promozione relative Facebook app e il mio intento è quello di creare una scheda sulla mia pagina dell’azienda che fornirà l’accesso all’app.

Una volta loro, gli utenti possono nominare le aziende locali per i premi. Più tardi, una volta che le nomine sono in, gli utenti possono votare per un vincitore.

Ho integrato Open Graph nella mia app in modo che io possa usufruire di Tipi di Oggetto (Organization), i Tipi di Azione (Nominate, Vote For), e le Aggregazioni (Nominations). Il mio obiettivo principale è quindi il trasferimento di tali azioni su l’utente timeline.

Ho usato il recipebox esempio come la mia base. Ho fornito il mio codice per dimostrare l’autenticazione e l’azione post tenuti a presentare un tipo di azione/tipo di oggetto combinazione.

<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US"> 
<head prefix="og: http://ogp.me/ns# og_<<app namespace>>: http://ogp.me/ns/apps/<<app namespace>>#"> 
    <meta property="fb:app_id" content="<<app id>>" /> 
    <meta property="og:type" content="<<app namespace>>:organization" /> 
    <meta property="og:title" content="Client 1" /> 
    <meta property="og:image" content="<<client image path>>" /> 
    <meta property="og:description" content="Client 1 description here ... " /> 
    <meta property="og:url" content="<<custom client URL>>">
    <script src="http://connect.facebook.net/en_US/all.js"></script>
    <script type="text/javascript">
        //Load the SDK Asynchronously
        (function(d){
            var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
            if (d.getElementById(id)) {return;}
            js = d.createElement('script'); js.id = id; js.async = true;
            js.src = "//connect.facebook.net/en_US/all.js";
            ref.parentNode.insertBefore(js, ref);
        }(document));

        //Init the SDK upon load
        window.fbAsyncInit = function() {
            FB.init({
                appId      : '<<app id>>', //App ID
                status     : true, //check login status
                cookie     : true, //enable cookies to allow the server to access the session
                xfbml      : true  //parse XFBML
            });

            //listen for and handle auth.statusChange events
            FB.Event.subscribe('auth.statusChange', function(response) {
                if (response.authResponse) {
                    //user has auth'd your app and is logged into Facebook
                    FB.api('/me', function(me){
                        if (me.name) {
                            document.getElementById('auth-displayname').innerHTML = me.name;
                        }
                    })
                    document.getElementById('auth-loggedout').style.display = 'none';
                    document.getElementById('auth-loggedin').style.display = 'block';
                } else {
                    //user has not auth'd your app, or is not logged into Facebook
                    document.getElementById('auth-loggedout').style.display = 'block';
                    document.getElementById('auth-loggedin').style.display = 'none';
                }
            });

            //respond to clicks on the login and logout links
            document.getElementById('auth-loginlink').addEventListener('click', function(){
                FB.login();
            });
            document.getElementById('auth-logoutlink').addEventListener('click', function(){
                FB.logout();
            });
        }       

        function nominate () {
            FB.api('/me/<<app namespace>>:Nominate&organization=<<custom client URL>>', 'post',  function(response) {

                if (! response || response.error) {
                    alert('Error occured');
                    console.log(response);
                } else {
                    alert('Post was successful! Action ID: ' + response.id);
                }
            });
        }
    </script>
</head> 
<body> 
    <div id="fb-root"></div>
    <div id="auth-status">
        <div id="auth-loggedout">
            <a href="#" id="auth-loginlink">Login</a>
        </div>
        <div id="auth-loggedin" style="display:none">
            Hi, <span id="auth-displayname"></span>  
            (<a href="#" id="auth-logoutlink">logout</a>)
        </div>
    </div>
    <h2>Client 1</h2> 
    <form>
        <input type="button" value="Nominate" onclick="nominate()" />
    </form> 
    <fb:activity actions="<<app namespace>>:nominate"></fb:activity>
</body> 
</html>

Un utente di prova è verificato il seguente errore:

Requires extended permission: publish_actions

E ho riscontrato il seguente errore (io sono un Admin per questa applicazione):

This method must be called with an app access_token 

Il primo errore è preoccupante per me. Non è possibile selezionare publish_actions da Apps | <My App> | Permissions | Extended Permissions. Inoltre, i rimedi ho encounted suggeriscono ho ri-classificare la mia app per Games (non funziona) e per completare il mio Aggregazioni (io l’ho fatto; ancora non funziona).

  1. Come posso risolvere questo errore?
  2. Cosa posso fare per risolvere il problema mio This method must be called with an app access_token errore?

Grazie in anticipo,

Mike

MODIFICA

Credo che il access_token errore che stavo incontrando era dovuto al fatto che stavo testando/interagire con le app direttamente sulla Pagina URL della Scheda; non attraverso Facebook.

Io non ricevo più il Requires extended permission: publish_actions error; tuttavia, il mio tester e sviluppatori. So che si verifichi questo errore perché il publish_actions autorizzazione non è richiesta iniziale facebook.com prompt di login.

Se il mio Sviluppatori/Tester di effettuare il logout da Facebook, poi nuovamente il log-in con il mio prompt:

FB.login(function (response) { }, { scope:'publish_actions'});

Quindi questa autorizzazione e l’app è integrata nel loro Facebook sessione.

La mia domanda finale è: – c’è un de facto, il metodo preferito per la richiesta di tale autorizzazione senza log-in/out di Facebook?

Posso solo vedere si chiama FB.login(), senza alcun scope parametro – allora, dove si aspetta l’autorizzazione publish_actions essere concesso?

OriginaleL’autore mykisscool | 2012-08-23

2 Replies
  1. 2

    Ho risolto entrambi i miei errori. Grazie a chi mi ha fornito il feedback e mi ha messo sulla strada giusta.

    Questi errori sono stati risolti:

    1. Requires extended permission: publish_actions
    
    2. This method must be called with an app access_token 
    

    Per cominciare, CBroe è giusto. Dal momento che ho bisogno di autorizzazioni estese (publish_actions) ho bisogno di specificare questo è il mio oggetto opzioni dopo la funzione di callback in FB.login() in questo modo:

    FB.login(function (response) {
        if (response.authResponse) { //The user has authenticated
            authenticatedSoDoSomething();
        } 
        else { //The user has not authenticated
            notAuthenticatedSoDoSomethingElse(); 
        }
    }, { scope:'publish_actions' });
    

    Infine, non ho avuto successo utilizzando il JavaScript SDK per la pubblicazione di un’azione di un utente timeline via FB.api(). Questo è il codice che ho era utilizzando:

    FB.api('/me/<<app namespace>>:<<my action>>&<<my object>>=<<a URL>>', 'post',
        function(response) {
            if (! response || response.error) {
                alert('Error occured');
            } else {
                alert('Post was successful! Action ID: ' + response.id);
            }
    })
    

    Ho trascurato di includere l’app token di accesso. L’app token di accesso può essere costruito concatenando le app id, seguita da un tubo, seguito dal segreto di app.

    Ho usato il PHP SDK per soddisfare questa richiesta, ma ho sempre voluto mantenere la mia api segreto di un segreto. Qui c’è [più] il codice che ho usato:

    require_once('facebook-php-sdk/src/facebook.php');
    
    $facebook = new Facebook(
        array(
            'appId' => '<<my app id>>', 
            'secret' => '<<my app secret>>'));
    
    $user = $facebook->getUser();
    
    if ($user) {
        try {
            $user_profile = $facebook->api('/me');
        } 
        catch (FacebookApiException $e) {
            error_log($e);
            $user = null;
            echo json_encode(array('success' => false));
        }
    }
    
    try {
        $facebook->api('/' . $user . '/<<app namespace>>:<<my action>>&<<my object>>=<<a URL>>', 'POST', array('access_token' => $facebook->getAppId() . '|' . $facebook->getApiSecret()));
    }
    catch (FacebookApiException $e) {
        echo var_dump($e->getResult());
    }
    

    Spero che questo aiuta!

    OriginaleL’autore mykisscool

  2. 0

    Per il secondo, effettuare la chiamata con il tuo App Token Di Accesso come dice errore; se stai già facendo), e non riesce, controllare l’app non è impostato a ‘Nativi/Desktop’ modalità nelle impostazioni dell’applicazione in facebook App Dashboard. Se lo è, l’app token di accesso non è attendibile e l’API agisce come se non hai fornito.

    Per la prima, è che gli utenti sono la concessione di publish_actions autorizzazione per la tua applicazione? Una chiamata a /me/permissions con il token di accesso dell’utente vi mostra quali vengono concesse le autorizzazioni. Nota che il autenticato rinvii /app center flusso di accesso separato per la vostra app di flusso regolare per gli utenti, che al termine di via autenticata di rinvio o l’app center, in modo da controllare che si sta includendo publish_actions in scope nella chiamata a Oauth finestra di Dialogo.

    OriginaleL’autore Igy

Lascia un commento