2012-02-25 57 views

回答

1

它眷於你如何建立it.There有一定數量的圖書館,你可以用它來建立你登錄系統和少數是

  1. Joid
  2. openid4java

這裏是一個大綱,你需要做的所有事情,才能使整個流程

  1. 創建一個JSP頁面,用戶可以選擇一種方式來選擇他的登錄系統。
  2. 調用爲此標識創建認證請求的動作類。
  3. 將用戶重定向到OpenId服務提供商,讓他自己授權。
  4. 在您的回調操作中接收OpenID提供程序的身份驗證響應。
  5. 如果您需要存儲一些信息,則解析響應。
2

以下舉例說明使用Oauth的Single Sign On(SSO),您可以爲其創建一個類似於Stack Overflow的SSO系統。

使用劃線:https://github.com/fernandezpablo85/scribe-java/wiki/getting-started

下面的例子將展示使用Twitter ...

1)示範動作得到嘰嘰喳喳憑據。

package com.quaternion.struts2basic.action; 

import com.opensymphony.xwork2.ActionSupport; 
import java.util.Map; 
import org.apache.struts2.convention.annotation.Result; 
import org.apache.struts2.convention.annotation.Results; 
import org.apache.struts2.interceptor.SessionAware; 
import org.scribe.builder.ServiceBuilder; 
import org.scribe.builder.api.TwitterApi; 
import org.scribe.model.Token; 
import org.scribe.oauth.OAuthService; 

@Results(value = { 
    @Result(name = "success", location = "${authorizationURL}", type = "redirect"), 
    @Result(name = "error", location = "/WEB-INF/content/error.jsp") 
}) 
public class TwitterGrantAccess extends ActionSupport implements SessionAware { 

    private Map<String, Object> session; 
    private String authorizationURL = null; 

    @Override 
    public String execute() { 
     //Twitter twitter = new TwitterFactory().getInstance(); 
     String consumer_key = "rUPV8tpIcFtyMeSDlnzclA"; 
     String consumer_secret = "16omdjNoEYgwoXfZMc0XrXSxiHDaS0UZUxQzWhTFg"; 

     OAuthService twitterService = new ServiceBuilder() 
       .provider(TwitterApi.class) 
       .apiKey(consumer_key) 
       .apiSecret(consumer_secret) 
       .callback("http://127.0.0.1:8080/Struts2Basic/twitter-callback") 
       .build(); 
     Token requestToken = twitterService.getRequestToken(); 
     authorizationURL = twitterService.getAuthorizationUrl(requestToken); 
     session.put("twitterService", twitterService); 
     session.put("requestToken", requestToken); 
     return SUCCESS; 
    } 

    public String getAuthorizationURL() { 
     return this.authorizationURL; 
    } 

    @Override 
    public void setSession(Map<String, Object> map) { 
     this.session = map; 
    } 
} 

2)動作,其嘰嘰喳喳重定向回...

package com.quaternion.struts2basic.action; 

import com.opensymphony.xwork2.ActionSupport; 
import java.util.Map; 
import org.apache.struts2.convention.annotation.Result; 
import org.apache.struts2.convention.annotation.Results; 
import org.apache.struts2.interceptor.SessionAware; 
import org.scribe.model.Token; 
import org.scribe.model.Verifier; 
import org.scribe.oauth.OAuthService; 

@Results(value = { 
    @Result(name = "success", location = "/WEB-INF/content/twitter-callback-success.jsp"), 
    @Result(name = "error", location = "/WEB-INF/content/error.jsp") 
}) 
public class TwitterCallback extends ActionSupport implements SessionAware { 

    private Map<String, Object> session; 
    private String key; 
    private String secret; 
    //returned from twitter 
    private String oauth_token; 
    private String oauth_verifier; 

    @Override 
    public String execute() { 
     if (session.containsKey("accessToken") && session.get("accessToken") != null) { 
      return SUCCESS; //accessToken already exists! 
     } 
     Token requestToken = (Token) session.get("requestToken"); 
     if (requestToken == null) { 
      super.addActionError("requestToken is null"); 
      return ERROR; 
     } 
     OAuthService twitterService = (OAuthService) session.get("twitterService"); 
     System.out.println(requestToken.toString()); 
     System.out.println(this.getOauth_verifier()); 
     //Token accessToken = twitter.getOAuthAccessToken(requestToken, this.getOauth_verifier()); 
     Token accessToken = twitterService.getAccessToken(requestToken, new Verifier(this.getOauth_verifier())); 
     session.put("accessToken", accessToken); 
     this.setKey(accessToken.getToken()); //just to see something happen 
     this.setSecret(accessToken.getSecret());//just to see something happen 
     return SUCCESS; 
    } 

    @Override 
    public void setSession(Map<String, Object> map) { 
     this.session = map; 
    } 

    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 

    public String getSecret() { 
     return secret; 
    } 

    public void setSecret(String secret) { 
     this.secret = secret; 
    } 

    public String getOauth_token() { 
     return oauth_token; 
    } 

    public void setOauth_token(String oauth_token) { 
     this.oauth_token = oauth_token; 
    } 

    public String getOauth_verifier() { 
     return oauth_verifier; 
    } 

    public void setOauth_verifier(String oauth_verifier) { 
     this.oauth_verifier = oauth_verifier; 
    } 
} 

我會忽略的意見,因爲他們真的沒有做任何事情

3)該宗訴訟寫入「你好,來自Struts2!「,這不是很好,因爲twitter只會讓你運行一次,因爲狀態是一樣的,不會讓你再次發佈它......但它會讓整個過程。更新狀態後,它將重定向到您的Twitter頁面,如果您更改當然重定向中的URL的「YOUR_USER_NAME」部分。

package com.quaternion.struts2basic.action; 

import com.opensymphony.xwork2.ActionSupport; 
import java.util.Map; 
import org.apache.struts2.convention.annotation.Result; 
import org.apache.struts2.convention.annotation.Results; 
import org.apache.struts2.interceptor.SessionAware; 
import org.scribe.model.OAuthRequest; 
import org.scribe.model.Response; 
import org.scribe.model.Token; 
import org.scribe.model.Verb; 
import org.scribe.oauth.OAuthService; 

@Results({ 
    @Result(name = "success", location = "https://twitter.com/#!/YOUR_USER_NAME", type = "redirect") 
}) 
public class Tweet extends ActionSupport implements SessionAware { 

    private Map<String, Object> session; 
    private String status; 

    @Override 
    public String execute() { 
     Token accessToken = (Token) session.get("accessToken"); 
     OAuthService twitterService = (OAuthService) session.get("twitterService"); 
     String url = "http://api.twitter.com/1/statuses/update.json?status="; 
     String twitterStatus = "hello!"; 
     OAuthRequest request = new OAuthRequest(Verb.POST, url + twitterStatus); 
     twitterService.signRequest(accessToken, request); 
     Response response = request.send(); 
     return SUCCESS; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public String getStatus() { 
     return this.status; 
    } 

    @Override 
    public void setSession(Map<String, Object> map) { 
     session = map; 
    } 
} 

這是非常多的。關於抄寫員的好處是,爲不同的提供者配置很容易(對於基本身份驗證,以後使用他們的API是另一回事,這取決於你)。

+0

抄寫員使用Oauth而不是openId我相信。我在我的所有應用程序中使用抄寫員:) – 2012-02-25 17:17:29

+0

我不使用OpenId我錯誤地認爲OpenId只是另一個使用Oauth的身份提供者,非常多我的錯誤...但是OP想要一種方式來執行SSO,完全致力於OpenId ...因此,我將使用Oauth作爲SSO方法來讀取答案,也許有人會發現它的用處。 – Quaternion 2012-02-25 22:30:34

+0

+1個不錯的例子。我剛剛去OpenId,因爲OP要求像使用開放標識系統的堆棧溢出:)感謝真正的好例子 – 2012-02-26 05:29:20