2015-05-09 2 views
0

Я использовал писца, чтобы получить токен oauth из facebook и передал токен в restfb. Я был в состоянии добиться этого. Я смог получить информацию обо мне, такую ​​как имя, адрес электронной почты и идентификатор. Но когда я попытался получить фотографии, мне не удалось. Я заметил, что он вернул null, когда я попытался поместить инструкцию печати (отладки), поскольку мне не удалось получить информацию о фотографиях. Является ли проблема с токеном, поскольку я получаю нулевой указатель при попытке сохранить mongodb. Я также попробовал напечатать токен, но null? Нужна помощь.Токен при попытке захватить facebook pic

Ниже мой код:

@Controller 
public class HomeController { 


private static final String STATE = "state"; 
private String client_id = "***************"; 
private String app_secret = "**********************"; 
private String url = "http://localhost:8080"; 
private ObjectMapper objectMapper; 
private OAuthService oAuthService; 
private FacebookClient facebookClient; 

@Autowired 
UserAccountService userAccountService; 
@Autowired 
UserPhotoService userPhotoService; 


public HomeController() { 
    this.oAuthService = buildOAuthService(client_id, app_secret); 
} 
//starts the oauth by passing necessary parameters and initializes oauthservice. 
private OAuthService buildOAuthService(String client_id, String app_secret){ 
    return new ServiceBuilder() 
      .apiKey(client_id) 
      .apiSecret(app_secret) 
      .callback(url+"/auth/facebook/callback") //redirects the callback and must match the url in facebook settings. 
      .provider(FacebookApi.class) 
      .scope("email") 
      .build(); 
} 
    //login page redirects to facebook to get user details 
    @RequestMapping(value="/") 
    public String HomePage() { 
    return "login"; 
    } 

//link redirects to facebook for access token. 
@RequestMapping(value="/auth/facebook", method=RequestMethod.GET) 
public RedirectView startAuthentication(HttpSession httpSession) throws OAuthException { 
    String state = UUID.randomUUID().toString(); 
    httpSession.setAttribute(STATE, state); 
    String authorizationUrl = oAuthService.getAuthorizationUrl(Token.empty())+"&"+STATE+"="+state; 
    return new RedirectView(authorizationUrl); 
} 
//method handles the callback from facebook 
@RequestMapping(value="/auth/facebook/callback") 
public String callback(@RequestParam("code")String code, @RequestParam(STATE)String state, HttpSession httpsession) throws IOException 
{ 
    //checks state parameter. 
    String stateFromSession = (String)httpsession.getAttribute(STATE); 
    httpsession.removeAttribute(STATE); 
    if(!state.equals(stateFromSession)) { //incase of failure redirects user to login 
     return "login"; 
    } 
    //Exchanges the access token 
    Token accessToken = getAccessToken(code); 
    //pass token to restfb 
    this.facebookClient = new DefaultFacebookClient(accessToken.getToken(), Version.VERSION_2_2); 
    return "logged"; //successfully logged in. 
} 

//retrieves the access token 
private Token getAccessToken(String code) { 
    Verifier verify = new Verifier(code); 
    return oAuthService.getAccessToken(Token.empty(), verify);//Token.Empty() method in scribe and handles OAuthservice for both OAuth1 and 2. 
} 

@RequestMapping(value="/{user-id}/attending", method = RequestMethod.GET) 
@ResponseStatus(HttpStatus.OK) 
public @ResponseBody void getProfile(@PathVariable("user-id")String userId) { 
    User me = facebookClient.fetchObject("me", User.class); 
    userAccountService.create(me);//able to retrieve user info successfully 
    userPhotoService.create(me, facebookClient); // i pass the token 

    return; 
} 

Класс ниже это сервис, который извлекает фото:

@Repository 
public class UserPhotoServiceImpl implements UserPhotoService { 

@Autowired 
private PhotoRepo photorepo; //extends mongorepository 

public UserPhotos create(User me, FacebookClient faceboookClient){ 
    UserPhotos userPhotos = new UserPhotos(); 
    Connection<Photo> photoConnection = facebookClient.fetchConnection("me/photos", Photo.class); 
    for(List<Photo> eachPhoto: photoConnection) { 
     for(Photo p: eachPhoto){ 
      userPhotos.setPhotoId(p.getId());//storing info in userPhotos class 
      userPhotos.setCountry(p.getPlace().getLocation().getCountry()); 
     } 
    } 
    System.out.println(userPhotos.getCountry());//for debugging purposes returns null and cannot retrieve any photos. 
    photorepo.save(userPhotos); //trying to save to mongoDB but returns null. 

    return userPhotos; 
    } 
} // 

Ниже моя UserPhotoService класс:

public interface UserPhotoService { 
UserPhotos create(User me, FacebookClient facebookClient); 
} 

кажется лексема возвращает нулевой или не тот же токен. Пожалуйста, мне нужна помощь в том, что не так.

+0

Похоже, вы не просите разрешения на доступ к фотографиям пользователя во время входа в систему, только разрешение в вашей области действия - «электронная почта». – CBroe

+0

@CBroe я добавил разрешение user_photo, но все равно не успел –

+0

Вы пытались проверить токен доступа и запрос на графике api explorer? – Norbert

ответ

0

Я не уверен, что это полезно или нет, но при просмотре веб-сайта и загрузке фотографии в дополнение к URL-адресу фотографии должны присутствовать три значения ключа заголовка, чтобы загрузить полный. Эти три основных значения: запрос GET

oh 
oe 
dl 

Полный URL будет выглядеть примерно так:

https://thefolder.net/photos/v/t1.09/thenumericcodeofthephoto.jpg?oh=somelongalphanumericcode&oe=somemorealphanumerics&dl=1 

Мое предположение было бы, что вам не хватает одного из ключевых значений, которые необходимо передать в сервер для извлечения файла (ов). Вместо того, чтобы загружать все файлы в один кусок, попробовали ли вы загрузить отдельную фотографию самостоятельно? Сначала я пытаюсь загрузить уникальный файл, так как его легче устранить, и как только он будет успешным, попробуйте загрузить больше файлов за раз.

EDIT *** Просмотрев документацию для restFB, мне интересно, причина в том, что это не сработает, потому что команды Facebook REST больше не поддерживаются Facebook и не будут работать. Все, что я вижу для доступа к REST для Facebook, связано с графикой. Возможно, вы просто не можете получить доступ к Facebook, используя старый интерфейс REST.

+0

@ 3m0I3y Я попытался получить одну фотографию, но не успел –

+0

Может быть, команды REST больше не поддерживаются. Я просматривал документацию, и я не вижу никаких допустимых команд для загрузки через REST. Надеюсь, вы найдете то, что ищете. Удачи. – 3m0l3y

+0

Ох. Да. Я нашел это. Это похоже на то, что REST больше не работает. [Документы разработчиков Facebook] (https://developers.facebook.com/docs/apps/upgrading#restapiv21) – 3m0l3y