2012-03-22 54 views
2

我正在嘗試驗證我的網站的linkedin用戶。我正在使用Scribe來處理認證。如何在xPages中使用scribe使用java驗證linkedin用戶

我正試圖在兩個步驟中完成此操作。

step1只是獲取正確的url並將用戶重定向到確認頁面。這工作正常。並且在我確認後,我被重定向回到我網站上的一個頁面。

步驟2是我遇到問題的人。當重定向的xpage打開時,我使用來自url的令牌和驗證者密鑰調用step2方法。

有一件事我沒有得到的是,如果我真的需要在兩個步驟中構建服務,並且這是什麼導致我的問題。我如何在兩個步驟之間發送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(); 

    } 


} 
+2

你看過社交啓用器插件嗎? – jjtbsomhorst 2012-03-22 07:01:08

+0

是的,我做到了,社交促成因素與關鍵商店密切相關。所以如果你想要另一種解決方案,你就不能使用它。 – 2012-03-22 07:14:21

+0

如果您需要將requestToken傳遞給步驟2,您可以創建一個(會話範圍)userBean並將其存儲在那裏。 – 2012-03-22 08:57:29

回答

4

嘗試存儲和在檢索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。最後

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

:這個添加到Domino服務器的java.policy文件,你不需要從beforeRenderResponse事件傳遞令牌和驗證。他們可以很容易地在步驟2功能中使用

XSPContext context = XSPContext.getXSPContext(FacesContext.getCurrentInstance()); 
String oauth_verifier = context.getUrlParameter("oauth_verifier"); 
+0

不錯,完美的工作 – 2012-03-22 12:12:56

2

不要試圖重新發明輪子。社會推動者完全可以做到這一點,甚至更多。

下面是一些早期的文檔我寫道:http://www.openntf.org/Projects/pmt.nsf/DA2F4D351A9F15B28625792D002D1F18/%24file/SocialEnabler111006.pdf

重新「社會推動者是緊密聯繫在一起的密鑰存儲」 - 其實這是一個很大的好處。如果你想要做的不僅僅是一個原型,你需要提出一個解決方案,集中管理應用密鑰和用戶密鑰。

你也不想把這個OAuth跳舞代碼放在每個NSF中,但是使用可以在全局部署的社會啓用器插件。

我們與LinkedIn一起嘗試社交推動者,它的工作原理。我們只是不被允許開源這個樣本。

+1

好吧,這是有價值的信息,但很難這個問題的答案。作爲記錄。我沒有重新發明輪子。抄寫員很容易理解,只需要很少的代碼,而且我完全可以控制。 – 2012-03-23 07:57:02

+0

托馬斯,使用OAuth庫不是問題。管理密鑰併爲各種應用程序使用相同的基礎架構。 據我所知,這並不回答如何使用Scribe,但我建議使用社會推動者。 – 2012-03-23 11:32:40

+0

真遺憾你不允許發佈LinkedIn代碼。我也看了一下社會推動者,並且同意托馬斯的看法,Scribe更容易入門:這可能是因爲他們提供了簡單的樣本。 – 2012-03-25 19:02:23