Как аутентифицировать пользователей linkedin с помощью java, используя scribe в xPages

Я пытаюсь аутентифицировать пользователей LinkedIn для моего сайта. Я использую Scribe для проверки подлинности.

Я пытаюсь сделать это в двухэтапном процессе.

step1 просто получает правильный URL-адрес и перенаправляет пользователя на страницу подтверждения. это работает нормально. и после того, как я подтвердил, меня перенаправляют обратно на страницу моего сайта.

Шаг 2 - это тот, с которым у меня проблемы. когда открывается перенаправленная xpage, я вызываю метод step2, используя токен и ключ проверки из URL-адреса.

Одна вещь, которую я не понимаю, заключается в том, действительно ли мне нужно создавать службу на обоих этапах и является ли это причиной моих проблем. как мне отправить requestToken между двумя моими шагами. пожалуйста, посоветуйте, как заставить этот сценарий работать

Спасибо - Томас


import org.scribe.builder.ServiceBuilder;
import org.scribe.oauth.OAuthService;
import java.util.Scanner;
import org.scribe.builder.*;
import org.scribe.model.*;
import org.scribe.oauth.*;
import org.scribe.builder.api.*;
import javax.faces.context.*;


public class DoDance
{
      private static final String PROTECTED_RESOURCE_URL = "http://api.linkedin.com/v1/people/~/connections:(id,last-name)";

  public void step1()
  {
     try {
            OAuthService service = new ServiceBuilder()
            .provider(LinkedInApi.class)
            .apiKey("key")
            .apiSecret("secret")
            .callback("http://www.acme.com/linkedin.xsp")
            .build();

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

        // Redirects the user to linkedin confirmation page
        // This is working fine
        FacesContext.getCurrentInstance().getExternalContext().redirect(authUrl);

    } catch (Exception e) {
        e.printStackTrace(); 
    }
  }

  public String step2(String tok,String ver){

      // this method is called in the beforeRenderResponse in the redirected xpage
      // I get the token and verifyer in from the url parameters

    Response response = null;
    try {
          OAuthService service = new ServiceBuilder()
          .provider(LinkedInApi.class)
          .apiKey("key")
          .apiSecret("secret")
          .build();

          Token accessToken = service.getAccessToken(???,new Verifier(ver));
          OAuthRequest request = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL);
          service.signRequest(accessToken, request);
          response = request.send();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return "Body = " + response.getBody();

  }


}

person Thomas Adrian    schedule 22.03.2012    source источник
comment
Вы смотрели на плагин Social Enabler?   -  person jjtbsomhorst    schedule 22.03.2012
comment
да, социальный активатор тесно связан с хранилищем ключей. поэтому вы не можете использовать его, если хотите другое решение.   -  person Thomas Adrian    schedule 22.03.2012
comment
Если вам нужно передать requestToken на шаг 2, вы можете создать userBean (в рамках сеанса) и сохранить его там.   -  person Mark Leusink    schedule 22.03.2012
comment
Приведенный выше код уже является bean-компонентом с областью действия сеанса, я попытался установить токен как поле в классе и установить его на шаге 1, но когда я вызываю шаг 2, я получаю исключение нулевого указателя при вызове токена.   -  person Thomas Adrian    schedule 22.03.2012
comment
@ThomasAdrian: сохраните токен запроса либо в базе данных, либо в сеансе, и когда ваш пользователь перенаправляется обратно, все, что вам нужно, чтобы удалить его из сеанса.   -  person Umesh Awasthi    schedule 22.03.2012


Ответы (2)


Попробуйте сохранить и получить requestToken в пользовательском компоненте (на уровне сеанса).

public class User {

private Token requestToken;

private static String BEAN_NAME = "userBean";

public static User get() {
    FacesContext context = FacesContext.getCurrentInstance();
    return (User) context.getApplication().getVariableResolver().resolveVariable(context, BEAN_NAME);
}

public Token getRequestToken() {
    return requestToken;
}

public void setRequestToken(Token requestToken) {
    this.requestToken = requestToken;
}


}

Вам также, вероятно, потребуется изменить настройки безопасности JVM, чтобы использовать Scribe. Добавьте это в файл java.policy сервера Domino:

grant {
permission java.util.PropertyPermission
"http.keepAlive", "read, write";
};

Наконец: вам не нужно передавать токен и верификатор из события beforeRenderResponse. Их можно легко получить в функции step2, используя

XSPContext context = XSPContext.getXSPContext( FacesContext.getCurrentInstance() );
String oauth_verifier = context.getUrlParameter("oauth_verifier");
person Mark Leusink    schedule 22.03.2012

Не пытайтесь изобретать велосипед. Социальный активатор делает именно это и многое другое.

Вот один из первых документов, который я написал: http://www.openntf.org/Projects/pmt.nsf/DA2F4D351A9F15B28625792D002D1F18/%24file/SocialEnabler111006.pdf

Re «социальный активатор тесно привязан к хранилищу ключей» — это на самом деле большое преимущество. Если вы хотите сделать больше, чем прототип, вам нужно придумать решение, как и где централизованно управлять как ключами приложения, так и пользовательскими ключами.

Вы также не хотите размещать этот танцевальный код OAuth в каждом NSF, а используйте подключаемый модуль социальных сетей, который можно развернуть глобально.

Мы попробовали социальный активатор с LinkedIn, и он работает. Нам просто не разрешили открыть исходный код этого образца.

person Niklas Heidloff    schedule 23.03.2012
comment
Хорошо, это ценная информация, но вряд ли ответ на этот вопрос. Для записи. Я не стал изобретать велосипед. Scribe прост для понимания, требуется очень мало кода, и у меня есть полный контроль. - person Thomas Adrian; 23.03.2012
comment
Томас, использование библиотеки OAuth не проблема. Управление ключами и использование одной и той же инфраструктуры для различных приложений. Я понимаю, что это не ответ на вопрос, как использовать Scribe, но я рекомендую использовать социальный активатор. - person Niklas Heidloff; 23.03.2012
comment
Очень жаль, что вам не разрешено публиковать код LinkedIn. Я также посмотрел на социальный активатор и согласен с Томасом в том, что с Scribe легче начать работу: это, вероятно, из-за простых примеров, которые они предоставляют. - person Mark Leusink; 25.03.2012