0

이름, 현재 위치 및 프로필 사진으로 내 친구 목록을 가져오고 싶습니다. GRAPH API 탐색기 도구에서 쿼리 및 액세스 토큰 (필요한 범위 매개 변수 사용)을 실행했는데 제대로 작동합니다. ->https://developers.facebook.com/tools/explorer?method=GET&path=me%2Ffriends%3Ffields%3Dname%2Clocation%2Cpicture액세스 토큰에 범위가 없습니다.

하지만 애플리케이션을 실행할 때마다 필요한 스코프가없는 액세스 토큰이 생깁니다. 그것은 없다). 내 범위를 액세스 토큰에 보내려면 어떻게해야합니까?

범위 내가 액세스 토큰에 부여 할 : 스코프 : friends_location의 USER_LOCATION 내가 로컬 호스트 환경에서 작업

user_relationships.

<html> 
<head></head> 
<body> 
<div id="fb-root"></div> 
<script src="//connect.facebook.net/en_US/all.js"></script> 
<script js.src = "//connect.facebook.net/en_US/all/debug.js"></script> 

<script> 
var accessToken 
var uid 

window.fbAsyncInit = function() { 
    FB.init({ 
    appId  : '493774134048550', // App ID 
    channelUrl : '//localhost/Facebook', // Channel File 
    status  : true, // check login status 
    cookie  : true, // enable cookies to allow the server to access the session 
    xfbml  : true // parse XFBML 
    }); 

    // Here we subscribe to the auth.authResponseChange JavaScript event. This event is fired 
    // for any authentication related change, such as login, logout or session refresh. This means that 
    // whenever someone who was previously logged out tries to log in again, the correct case below 
    // will be handled. 
    FB.Event.subscribe('auth.authResponseChange', function(response) { 
    // Here we specify what we do with the response anytime this event occurs. 
    if (response.status === 'connected') { 
     // The response object is returned with a status field that lets the app know the current 
     // login status of the person. In this case, we're handling the situation where they 
     // have logged in to the app. 

    uid = response.authResponse.userID; 
    accessToken = response.authResponse.accessToken; 
    console.log(uid); 
    console.log(accessToken); 

    testAPI(function(response) { 
      // handle the response 
      uid = response.authResponse.userID; 
    accessToken = response.authResponse.accessToken; 
    console.log(uid); 
    console.log(accessToken); 
     }, {scope: 'friends_location, user_location, user_relationships'}); 

    } else if (response.status === 'not_authorized') { 
     // In this case, the person is logged into Facebook, but not into the app, so we call 
     // FB.login() to prompt them to do so. 
     // In real-life usage, you wouldn't want to immediately prompt someone to login 
     // like this, for two reasons: 
     // (1) JavaScript created popup windows are blocked by most browsers unless they 
     // result from direct interaction from people using the app (such as a mouse click) 
     // (2) it is a bad experience to be continually prompted to login upon page load. 

     //FB.login(); 
     FB.login(function(response) { 
      // handle the response 
      uid = response.authResponse.userID; 
    accessToken = response.authResponse.accessToken; 
    console.log(uid); 
    console.log(accessToken); 
     }, {scope: 'friends_location, user_location, user_relationships'}); 

    } else { 
     // In this case, the person is not logged into Facebook, so we call the login() 
     // function to prompt them to do so. Note that at this stage there is no indication 
     // of whether they are logged into the app. If they aren't then they'll see the Login 
     // dialog right after they log in to Facebook. 
     // The same caveats as above apply to the FB.login() call here. 

// FB.login(); 

      FB.login(function(response) { 
      // handle the response 
      uid = response.authResponse.userID; 
    accessToken = response.authResponse.accessToken;µ 
    console.log(uid); 
    console.log(accessToken); 
     }, {scope: 'friends_location, user_location, user_relationships'}); 
    } 
    }, {scope: 'friends_location, user_location, user_relationships'}); 




    }; 

    // 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)); 

    // Here we run a very simple test of the Graph API after login is successful. 
    // This testAPI() function is only called in those cases. 
    function testAPI() { 
    console.log('Welcome! Fetching your information.... '); 
    //FB.api('/me', function(response) { 
    // console.log('Good to see you, ' + response.name + '.'); 
    // console.log(response); 
    //}); 

    ///me/friends?fields=name,location,picture&accesstoken=CAACEdEose0cBAFhNXAYgMjfAPWNxGZAdNdEJ6s2GAyIQp4zicpV0ZBZCeVINbiLvIxaFl33N0I1gZAZArREsHmOGiqQX2HPaNZCiU4W4Nq3VA12TrreKfeOtFSMvmZC8c1qYqu85NZAzzWDXWH5foXIWfPFk1ZBScNbAZD 
    FB.api('/'+uid+'/friends?fields=name,location,picture&accesstoken='+accessToken, function(response) { 

    //FB.api('/'+uid+'/friends?fields=name,location,picture&accesstoken=CAACEdEose0cBAJayThSg77Ydil76EM0W4zuJ9l29yKoIxlu6g37ZAX1CWQhpTStBL48xoX5g0Bbe8Va4wr6qqT2ft5tZBoNDZCWFYF7TtwmBnTDOSGWruOp0pSS9Ws1phfl5wiFbHeZAyUbdZBDdx3GLBHeysn6EZD', function(response) { 
     var teller1 = 0; 
     console.log('Good to see you, ' + response.name + '.'); 
     console.log(response.data); 
    for (var i=0;i<response.data.length;i++) 
    { 

    if(response.data[i].name && response.data[i].location && response.data[i].picture){ 
    console.log(response.data[i].name); 
     console.log(response.data[i].location.name); 
     console.log(response.data[i].picture.data.url); 
    teller1++; 
    } 


     //<img border="0" src="console.log(response.data[0].picture.data.url)"> 
     } 
     console.log(teller1); //aantal gebruikers met naam, locatie en picture 
     console.log(response.data.length); //aantal gebruikers in totaal 
    }); 


    } 

    //Logout 
    function fbLogout() { 
     FB.init(); 
     FB.logout(function (response) { 
      //Do what ever you want here when logged out like reloading the page 
      window.location.reload(); 
     }); 
    } 
</script> 

<!-- 
    Below we include the Login Button social plugin. This button uses the JavaScript SDK to 
    present a graphical Login button that triggers the FB.login() function when clicked. 

    Learn more about options for the login button plugin: 
    /docs/reference/plugins/login/ --> 

<fb:login-button show-faces="true" width="200" max-rows="1"></fb:login-button> 
<span id="fbLogout" onclick="fbLogout()"><a class="fb_button fb_button_medium"><span class="fb_button_text">Logout</span></a></span> 
</body> 
</html> 
+0

는 https://developers.facebook.com/tools/debug/access_token/를 통해 토큰을보고 해봤 (당신은 단지 여기에 추가해야합니다)? 무슨 말을하는 거니? – DrColossos

+0

그것은 비어있었습니다. 하지만 이제는 정확한 액세스 토큰을 가지고 있습니다. 문제는 범위가 @ 적절한 FB.login을 요청하지 않았다는 것입니다. 그렇지 않은 경우 첫 번째 로그인 후 액세스 토큰 (올바른 범위 포함)이 범위가없는 액세스 토큰으로 바뀌었기 때문에 연결되었을 때 물어야했습니다. – Shouse

답변

2

아래 코드를 response.status === 'connected'아래에 바꾸십시오. 범위가 추가 된 원래 코드의 다른 모든 부분을 제거하십시오.

if (response.status === 'connected') { 
      // The response object is returned with a status field that lets the app know the current 
      // login status of the person. In this case, we're handling the situation where they 
      // have logged in to the app. 

      if(accessToken) 
      { 
     // alert("Connected WITH accesToken"); 
      testAPI(); 
      } 
      else{ 
     // alert("Connected WITHOUT accesToken"); 
     FB.login(function(response) { 
       // handle the response 
       uid = response.authResponse.userID; 
     accessToken = response.authResponse.accessToken; 
     console.log(uid); 
     console.log(accessToken); 
      }, {scope: 'friends_location, user_location, user_relationships'}); 

     } 
+0

비동기 콜백에서 FB.login을 직접 사용하지 마십시오. 팝업 차단기가 즉시 차단합니다. –