Я использовал писца, чтобы получить токен 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);
}
кажется лексема возвращает нулевой или не тот же токен. Пожалуйста, мне нужна помощь в том, что не так.
Похоже, вы не просите разрешения на доступ к фотографиям пользователя во время входа в систему, только разрешение в вашей области действия - «электронная почта». – CBroe
@CBroe я добавил разрешение user_photo, но все равно не успел –
Вы пытались проверить токен доступа и запрос на графике api explorer? – Norbert