2009-12-15 79 views
2

我正在開發(現在嘗試)將與LinkedIn集成的portlet。LinkedIn集成 - 建立請求令牌

以下有關它的文檔: http://developer.linkedin.com/docs/DOC-1008 - > 授權LinkedIn成員的第一步是請求一個requestToken。該請求使用HTTP POST完成。 對於requestToken一步,下面的組件應該出現在你的串籤:

* HTTP Method (POST) 
* Request URI (https://api.linkedin.com/uas/oauth/requestToken) 
* oauth_callback 
* oauth_consumer_key 
* oauth_nonce 
* oauth_signature_method 
* oauth_timestamp 
* oauth_version 

我已經API(這是oauth_consumer_key)關鍵,我需要生成特定的URL字符串。 擁有此網址和HTTP連接下一個Java代碼:

private void processAuthentication() { 

    Calendar cal = Calendar.getInstance(); 
    Long ms = cal.getTimeInMillis(); 
    Long timestamp = ms/1000; 

    Random r = new Random(); 
    Long nonce = r.nextLong(); 

    String prefixUrl = "https://api.linkedin.com/uas/oauth/requestToken"; 
    String oauthCallback = "oauth_callback=http://localhost/"; 
    String oauthConsumerKey = 
      "&oauth_consumer_key=my_consumer_key"; 
    String oauthNonce = "&oauth_nonce=" + nonce.toString(); 
    String oauthSignatureMethod = "&oauth_signature_method=HMAC-SHA1"; 
    String oauthTimestamp = "&oauth_timestamp=" + timestamp.toString(); 
    String oauthVersion = "&oauth_version=1.0"; 

    String mainUrl = 
      oauthCallback + oauthConsumerKey + oauthNonce + oauthSignatureMethod 
        + oauthTimestamp + oauthVersion; 

    try { 
     prefixUrl = 
       URLEncoder.encode(prefixUrl, "UTF-8") + "&" 
         + URLEncoder.encode(mainUrl, "UTF-8"); 

     URL url = new URL(prefixUrl); 

     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestMethod("POST"); 
     String msg = connection.getResponseMessage(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

的問題是未來,對於那些,誰曾面臨過這樣的問題: 如何應該看看URL字符串連接,以及如何響應收到?

對於URL,它感興趣的是您生成的URL示例。 併爲有興趣的反應,獲得它的方法。 據我瞭解,建立HTTP連接後,該反應是:

connection.getResponseMessage(); 
+0

你是如何解決這個問題?任何鏈接? – Signare 2012-02-09 11:39:34

+0

@Signare在相當長的時間以前。如果我記得,我會通知你。 – sergionni 2012-02-09 13:32:17

+0

它非常緊迫,所以請.. – Signare 2012-02-09 13:36:26

回答

2

,你可以嘗試使用OAuth庫來處理連接:http://code.google.com/p/oauth/

+0

首先,我需要從這個存儲庫是: /code/java/core/consumer? – sergionni 2009-12-15 14:07:34

+0

或者我應該下載所有的java相關和使用.pom罐子? – sergionni 2009-12-15 14:10:39

3

@sergionni我找到問題的答案從linkedin-開發商

正如你所知道 第一步授權鏈接,在成員請求requestToken。該請求使用HTTP POST完成。

你的基本字符串應該結束了,如果您使用的是回調看起來像這樣:

POST &的https%3A%2F%2Fapi.linkedin.com%2Fuas%2Foauth%2FrequestToken & oauth_callback %3Dhttp%253A%252F%252Flocalhost%252Foauth_callback%26O auth_consumer_key%3DABCDEFGHIJKLMNOPQRSTUVWXYZ%26 oauth_nonce%3DoqwgSYFUD87MHmJJDv7bQqOF2EPnVus7Wkqj5duNByU%26 oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1259178158%26 oauth_version%3D1.0

然後您使用您的consumer_secret簽署此基本字符串,計算簽名。在這種情況下,如果你的祕密是1234567890,那麼簽名應該是TLQXuUzM7omwDbtXimn6bLDvfF8 =。

現在,您將生成的簽名以及oauth_nonce,oauth_callback,oauth_signature_method,oauth_timestamp,oauth_consumer_key和oauth_version一起生成一個HTTP授權標頭。對於該請求,該HTTP報頭將如下所示:

授權:OAuth的 oauth_nonce = 「oqwgSYFUD87MHmJJDv7bQqOF2EPnVus7Wkqj5duNByU」, oauth_callback = 「HTTP%3A%2F%2Flocalhost%2Foauth_callback」, oauth_signature_method = 「HMAC-SHA1」 , oauth_timestamp = 「1259178158」, oauth_consumer_key = 「ABCDEFGHIJKLMNOPQRSTUVWXYZ」, oauth_signature = 「TLQXuUzM7omwDbtXimn6bLDvfF8 =」, oauth_version = 「1.0」

請注意,HTTP報頭是一種罪過gle頭文件 - 不是每個組件的HTTP頭文件。你可以選擇提供一個realm =「http://api.linkedin.com」。

作爲對您對requestToken的請求的響應,您的requestToken將位於「oauth_token」響應字段中,我們通過「oauth_callback_confirmed」字段,oauth_token_secret和oauth_expires_in確認您的回調,以及一些其他值。

(在我們這裏你answaer)的反應會是什麼樣子:

的oauth_token = 94ab03c4-ae2c-45e4-8732-0e6c4899db63 & oauth_token_secret = be6ccb24-bf0a-4ea8-a4b1-0a70508e452b & oauth_callback_confirmed =真& oauth_expires_in = 599

+0

如果你有下一步的示例Java代碼(如上所述) *將用戶重定向到Linkedin授權服務器 *請求訪問令牌 *如何創建第一個API請求獲取用戶信息,然後通過mcs5vaibhav @ rediff.com 希望最好的合作從你身邊 – StackOverFlow 2010-07-22 19:25:10

+0

我解決了這個問題,無論如何謝謝 – sergionni 2010-07-26 08:12:30

0

我創建了一個插件播放架構能夠輕鬆地與LinkedIn的OAuth集成:geeks.aretotally.in/projects/play-framework-linkedin-module。希望它可以幫助。你應該查看Play,非常非常酷的Java框架。

0

portlet的身體:

public class LinkedInPortlet extends GenericPortlet { 

    public static final String PAGE_PIN = "pin"; 

    public static final String PAGE_EDIT = "edit"; 

    public static final String PAGE_PROFILE = "profile"; 

    public static final String PAGE_CONNECTIONS = "connections"; 

    public static final String FORM_LINKEDIN_PREFERENCES = "preferencesLinkedInForm"; 

    public static final String PAGE_VIEW_MY_PROFILE = "/WEB-INF/portlets/linkedin/myProfile.jsp"; 

    public static final String PAGE_VIEW_MY_CONNECTIONS = 
      "/WEB-INF/portlets/linkedin/myConnections.jsp"; 

    public static final String PAGE_PREFERENCES = "/WEB-INF/portlets/linkedin/edit.jsp"; 

    public void doView(RenderRequest request, RenderResponse response) throws PortletException, 
     IOException { 

     String view = PAGE_VIEW_MY_PROFILE; 

     String page = 
       (String) request.getPortletSession().getAttribute(
         "page_" + getPortletIdentifier(request), PortletSession.PORTLET_SCOPE); 

     String accessTokenToken = 
       getStringConfiguration(request, LinkedInPreferencesForm.PARAM_ACCESS_TOKEN_TOKEN); 
     String accessTokenSecret = 
       getStringConfiguration(request, LinkedInPreferencesForm.PARAM_ACCESS_TOKEN_SECRET); 

     LinkedInContact profile = new LinkedInContact(); 
     List<LinkedInContact> contacts = new ArrayList<LinkedInContact>(); 

     if (PAGE_PIN.equals(page)) { 
      view = PAGE_PREFERENCES; 
     } else if (PAGE_EDIT.equals(page)) { 
      view = PAGE_PREFERENCES; 
     } else if (PAGE_CONNECTIONS.equals(page)) { 
      try { 
       contacts = 
         ServiceResolver.getResolver().getLinkedInService().getConnections(
           accessTokenToken, accessTokenSecret); 
      } catch (ServiceException se) { 
       view = PAGE_PREFERENCES; 
       handleException(request, se); 
      } 
      view = PAGE_VIEW_MY_CONNECTIONS; 
     } else { 
      try { 
       profile = 
         ServiceResolver.getResolver().getLinkedInService().getProfile(
           accessTokenToken, accessTokenSecret); 
      } catch (ServiceException se) { 
       view = PAGE_PREFERENCES; 
       handleException(request, se); 
      } 

      view = PAGE_VIEW_MY_PROFILE; 
     } 

     request.setAttribute("profile", profile); 
     request.setAttribute("contacts", contacts); 

     response.setContentType(request.getResponseContentType()); 
     PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(view); 
     rd.include(request, response); 

    } 

    public void processAction(ActionRequest request, ActionResponse response) 
     throws PortletException, IOException { 

     String action; 

     action = (String) request.getParameter("action"); 

     String page = request.getParameter("page"); 

     if (page == null) { 
      page = PAGE_PROFILE; 
     } else if ("auth".equals(action)) { 
      request.getPortletSession().setAttribute(
        "requestToken_" + getPortletIdentifier(request), 
        ServiceResolver.getResolver().getLinkedInService().getRequestToken(), 
        PortletSession.APPLICATION_SCOPE); 
      LinkedInPreferencesForm form = new LinkedInPreferencesForm(request); 
      request.getPortletSession().setAttribute(
        FORM_LINKEDIN_PREFERENCES + getPortletIdentifier(request), form, 
        PortletSession.APPLICATION_SCOPE); 
      response.setPortletMode(PortletMode.EDIT); 
     } else if ("save".equals(action)) { 
      try { 
       try { 
        savePreferences(request, response); 
       } catch (ServiceException e) { 
        handleException(request, e); 
       } 
      } catch (PortletModeException e) { 
       handleException(request, e); 
      } 
     } else if ("myProfile".equals(action)) { 
      page = PAGE_PROFILE; 
     } else if ("myConnections".equals(action)) { 
      page = PAGE_CONNECTIONS; 
     } 

     if (page != null) { 
      request.getPortletSession().setAttribute("page_" + getPortletIdentifier(request), page, 
        PortletSession.PORTLET_SCOPE); 
     } 
    } 

    private void savePreferences(ActionRequest request, ActionResponse response) 
     throws PortletModeException, ServiceException { 

     LinkedInPreferencesForm form = new LinkedInPreferencesForm(request); 

     if (validateForm(request, form)) { 

      LinkedInRequestToken requestToken = 
        (LinkedInRequestToken) request.getPortletSession().getAttribute(
          "requestToken_" + getPortletIdentifier(request), 
          PortletSession.APPLICATION_SCOPE); 

      String pin = request.getParameter("pinCode"); 

      LinkedInAccessToken accessToken; 

      try { 
       accessToken = 
         ServiceResolver.getResolver().getLinkedInService().getAccessToken(
           requestToken, pin); 
      } catch (LinkedInOAuthServiceException ase) { 
       response.setPortletMode(PortletMode.EDIT); 
       throw new ServiceException("linkedin.authentication.failed"); 

      } 

      String tokenToken = requestToken.getToken(); 
      String secret = requestToken.getTokenSecret(); 
      String tokenURL = requestToken.getAuthorizationUrl(); 

      Properties configuration = new Properties(); 
      configuration.setProperty(LinkedInPreferencesForm.PARAM_PIN, form.getPin()); 
      configuration 
        .setProperty(LinkedInPreferencesForm.PARAM_REQUEST_TOKEN_TOKEN, tokenToken); 
      configuration.setProperty(LinkedInPreferencesForm.PARAM_REQUEST_TOKEN_SECRET, secret); 
      configuration.setProperty(LinkedInPreferencesForm.PARAM_REQUEST_TOKEN_URL, tokenURL); 
      configuration.setProperty(LinkedInPreferencesForm.PARAM_ACCESS_TOKEN_TOKEN, accessToken 
        .getToken()); 

      configuration.setProperty(LinkedInPreferencesForm.PARAM_ACCESS_TOKEN_SECRET, 
        accessToken.getTokenSecret()); 
      ServiceResolver.getResolver().getPortalService().savePortletConfiguration(request, 
        configuration); 

      resetSessionForm(request, FORM_LINKEDIN_PREFERENCES); 
      response.setPortletMode(PortletMode.VIEW); 

     } else { 
      // store in session 
      request.getPortletSession().setAttribute(
        FORM_LINKEDIN_PREFERENCES + getPortletIdentifier(request), form, 
        PortletSession.APPLICATION_SCOPE); 
      response.setPortletMode(PortletMode.EDIT); 
      logger.debug(FORM_LINKEDIN_PREFERENCES + " is in edit mode"); 
     } 
    } 

    @Override 
    protected void addConfiguration(MessageSource messageSource, Locale locale, 
     Map<String, String> result) { 
     result.put(LinkedInPreferencesForm.PARAM_PIN, messageSource.getMessage(
       "linkedIn.preferences.pin", null, locale)); 
     result.put(LinkedInPreferencesForm.PARAM_REQUEST_TOKEN_TOKEN, messageSource.getMessage(
       "linkedIn.preferences.requestTokenToken", null, locale)); 
     result.put(LinkedInPreferencesForm.PARAM_REQUEST_TOKEN_SECRET, messageSource.getMessage(
       "linkedIn.preferences.requestTokenSecret", null, locale)); 
     result.put(LinkedInPreferencesForm.PARAM_REQUEST_TOKEN_URL, messageSource.getMessage(
       "linkedIn.preferences.requestTokenURL", null, locale)); 
     result.put(LinkedInPreferencesForm.PARAM_ACCESS_TOKEN_TOKEN, messageSource.getMessage(
       "linkedIn.preferences.accessToken", null, locale)); 
     result.put(LinkedInPreferencesForm.PARAM_ACCESS_TOKEN_SECRET, messageSource.getMessage(
       "linkedIn.preferences.accessTokenSecret", null, locale)); 
    } 

    @Override 
    protected void addPreference(MessageSource messageSource, Locale locale, 
     Map<String, String> result) { 
    } 

    @Override 
    public String getAsyncTitle(RenderRequest request) { 
     return this.getTitle(request); 
    } 

    protected boolean validateForm(ActionRequest request, LinkedInPreferencesForm form) { 
     return form.validate(); 
    } 

    protected String myEdit(RenderRequest request, RenderResponse response) 
     throws PortletException, IOException { 

     LinkedInPreferencesForm form = new LinkedInPreferencesForm(); 

     form.setPin(getStringConfiguration(request, LinkedInPreferencesForm.PARAM_PIN)); 
     form.setRequestTokenToken(getStringConfiguration(request, 
       LinkedInPreferencesForm.PARAM_REQUEST_TOKEN_TOKEN)); 
     form.setRequestTokenSecret(getStringConfiguration(request, 
       LinkedInPreferencesForm.PARAM_REQUEST_TOKEN_SECRET)); 
     form.setRequestTokenURL(getStringConfiguration(request, 
       LinkedInPreferencesForm.PARAM_REQUEST_TOKEN_URL)); 

     registerSessionForm(request, FORM_LINKEDIN_PREFERENCES, form); 

     LinkedInRequestToken requestToken; 

     requestToken = 
       (LinkedInRequestToken) request.getPortletSession().getAttribute(
         "requestToken_" + getPortletIdentifier(request), 
         PortletSession.APPLICATION_SCOPE); 

     if (requestToken == null) { 
      requestToken = 
        new LinkedInRequestToken(form.getRequestTokenToken(), form 
          .getRequestTokenSecret()); 
      requestToken.setAuthorizationUrl(form.getRequestTokenURL()); 
     } 

     request.setAttribute("requestToken", requestToken); 

     return PAGE_PREFERENCES; 

    } 
}