2012-01-24 51 views
2

我正在嘗試爲我的web應用程序實現「Twitter」登錄。我使用scribe來簡化一些事情。與GWT的抄寫員做oauth

我的實現依賴於GWT RPC機制將授權url返回給客戶端,因此客戶端可以調用彈出窗口重定向到Autorization Url。

但是,當URL打開到新選項卡並且用戶使用Twitter帳戶登錄時,該頁面會提供需要鍵入到org.scribe.model中的PIN號碼(來自此站點:https://api.twitter.com/oauth/authorize)。 Modifier

這種方法對用戶來說很麻煩。需要的是,當用戶輸入的Twitter用戶名/密碼應該是。或者至少自動化所有其他過程。

我錯過了什麼嗎?

這裏是我的代碼:

twitterLogin.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      TwitterService.Util.getInstance().getAuthorizationUrl(new AsyncCallback<String>() { 
       @Override 
       public void onSuccess(String result) { 
        if (result != null) 
         Window.open(result, "__blank", null); 
       } 

       @Override 
       public void onFailure(Throwable caught) { 

       } 
      });    
     } 
    }); 
+0

讓你的代碼存儲在頁PIN號碼,因此用戶不必看到它或與Twitter服務進行驗證時鍵入它,然後,讓代碼提供它,而不是用戶。 – Cuga

+0

如何從授權頁面獲取PIN碼?在上面的代碼中,授權頁面作爲新窗口打開。或者我以錯誤的方式訪問授權頁面? – xybrek

+0

@xybrek:你沒有使用回調URL? –

回答

2

要使用OAuth的認證,你需要發送2個請求到認證服務器: - 率先拿到了「請求令牌」 - 然後得到「訪問令牌「

Twitter會在新窗口中打開認證頁面,他們可以在其中鍵入他們的Twitter用戶名/密碼,這是可以預料的。

if (req.getRequestURI().equals("/twitter")) { 
    Token requestToken = service.getRequestToken(); 
    System.out.println("Got the Request Token!" + requestToken.getToken()); 
    session = request.getSession(true); 
    session.setAttribute("TOKEN", requestToken); 
    response.sendRedirect(service.getAuthorizationUrl(requestToken)); 
} else if (req.getRequestURI().equals("/twitter/callback")) { 
    String code = request.getParameter("oauth_verifier"); 
    System.out.println("Verifier :: " + code); 
    System.out.println("service.getRequestToken()" + service.getRequestToken()); 
    session = request.getSession(false); 
    Token requestToken = (Token) session.getAttribute("TOKEN"); 
    System.out.println("requestToken from Session " + service.getRequestToken().getToken() + " Secr" + service.getRequestToken().getSecret()); 

    if (code != null && !code.isEmpty()) { 
     Verifier verifier = new Verifier(code); 
     Token accessToken = service.getAccessToken(requestToken, verifier); 
     OAuthRequest req = new OAuthRequest(Verb.GET, OAUTH_PROTECTED_URL); 
     service.signRequest(accessToken, req); 
     Response res = req.send(); 
     response.setContentType("text/plain"); 
     response.getWriter().println(res.getBody()); 
    } 
} 
+0

我已設置與Twitter開發頁此回調URL:http://127.0.0.1: 8888/main/oauth_callback,但是在授權來自auth頁面的應用程序之後,twitter只顯示一個PIN碼,並且不會調用我提供的URL。 – xybrek

+0

您確定Twitter能夠訪問僅限本地的URL嗎?我認爲他們需要一個可公開訪問的回調URL。 – Cuga

+0

另外,你確定你的Twitter API配置正確嗎?聽起來像你在OOB模式下使用Twitter:帶外模式 - 提供了「oob」,而不是在獲取請求令牌時提供基於URL的回調。一旦用戶向Twitter提供了他們的帳戶憑證,他們就會看到包含PIN碼的屏幕,並被要求將該代碼輸入到應用程序中。應用程序然後將此PIN作爲oauth_verifier發送到訪問令牌步驟以完成交換。 – Cuga