Как я могу использовать Scribe с JSF для подключения к LinkedIn API?

Основываясь на примере Scribe на github, я пытаюсь авторизовать свой приложение для использования API LinkedIn.

Вот мой текущий код, привязанный к нажатию кнопки:

public String generateFromLinkedIn() {
    OAuthService service = new ServiceBuilder()
         .provider(LinkedInApi.class)
         .apiKey(apiKey)
         .apiSecret(apiSecret)
         .callback("http://localhost:8080/Project/faces/linkedIn.xhtml").build();

    ExternalContext externalContext = FacesContext.getCurrentInstance()
         .getExternalContext();

    Token requestToken = service.getRequestToken();
    String authUrl = service.getAuthorizationUrl(requestToken);

    try {
        externalContext.redirect(authUrl);
    } catch (IOException ex) {
        Logger.getLogger(LinkedInController.class.getName()).log(Level.SEVERE, null, ex);
    }

    Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();

    Verifier v = new Verifier(parameterMap.get("oauth_verifier"));
    Token accessToken = service.getAccessToken(requestToken, v);

    OAuthRequest request = new OAuthRequest(Verb.GET, "https://api.linkedin.com/v1/people/~");

    service.signRequest(accessToken, request); 
    Response response = request.send();

    System.err.println(response.getBody());

    return "";
}

И на моей странице .xhtml у меня есть:

<h:commandButton value="Generate" action="#{linkedInController.generateFromLinkedIn()}"></h:commandButton>

Все работает нормально, пока я не пытаюсь получить Verifier из карты параметров, в которой нет никакого oauth_verifier. Я попытался разделить его на несколько методов, но пока не могу получить oauth_verifier из параметров URL-адреса, хотя он явно присутствует после возврата из диалогового окна авторизации LinkedIn.

Любые предложения о том, как правильно получить этот верификатор или как заставить Scribe работать с JSF?


person greenJavaDev    schedule 02.09.2014    source источник


Ответы (1)


Кажется, вы каким-то образом ожидаете, что перенаправленный запрос волшебным образом вернется в точно такое же место в коде и продолжится оттуда. Это неправда. Это эффективно 2 HTTP-запроса. По сути, вы все еще возитесь с картой параметров текущего запроса (того, который вызывает метод generateFromLinkedIn()).

После вызова redirect() вы должны вернуться из метода. Вы должны переместить оставшуюся часть кода в @PostConstruct или <f:viewAction> вспомогательного компонента, привязанного к linkedIn.xhtml. Это тот, кто вызывается с параметром.

person BalusC    schedule 02.09.2014
comment
Спасибо BalusC, сработало перемещение остатка кода в @PostConstruct вспомогательного компонента. Я ценю вашу помощь! - person greenJavaDev; 02.09.2014