嗨我正在嘗試構建像堆棧溢出一樣的登錄系統,但沒有找到在JSP中執行此操作的正確方法。我正在struts2中工作。如何在jsp中使用開放標識
1
A
回答
1
它眷於你如何建立it.There有一定數量的圖書館,你可以用它來建立你登錄系統和少數是
這裏是一個大綱,你需要做的所有事情,才能使整個流程
- 創建一個JSP頁面,用戶可以選擇一種方式來選擇他的登錄系統。
- 調用爲此標識創建認證請求的動作類。
- 將用戶重定向到OpenId服務提供商,讓他自己授權。
- 在您的回調操作中接收OpenID提供程序的身份驗證響應。
- 如果您需要存儲一些信息,則解析響應。
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是另一回事,這取決於你)。
相關問題
- 1. 在xcode中集成開放標識
- 2. 如何使用開放標識作爲登錄系統
- 3. 如何在數據庫中存儲開放標識號?
- 4. 如何在JavaScript中使用JSP標籤?
- 5. 如何將使用開放標識的Spring安全整合到GWT項目中
- 6. 如何在jsp中從1000開始生成唯一標識序列
- 7. 如何在ASP.NET MVC中使用標識
- 8. 如何在JSP片段中使用JSP標記?
- 9. 如何驗證共享主機中的開放標識?
- 10. 如何在開放標識實現註冊機制
- 11. 在jsp頁面中標識一個bean
- 12. 在JSP中創建會話標識?
- 13. 如何在JSP中檢索URL片段標識符
- 14. 如何在網址開頭使用語言標識
- 15. 開放源代碼標識與真實生活標識
- 16. 如何使用標識
- 17. Java中的開放標識身份驗證的JSP的任何替代方法Spring Web應用程序?
- 18. Java Velruse開放標識(OpenId,Google,Facebook,Yahoo,...)
- 19. 如何開始使用Netbeans,WSDL和JSP
- 20. 如何使標識
- 21. 如何將「<%」放置在jsp中?
- 22. 在屬性中使用jsp標籤來定製jsp標籤
- 23. 如何使用Backstretch標識目標ID
- 24. 如何在Firefox中使用JSP,Tomcat打開word文檔8
- 25. 如何使用文件路徑在Jsp中打開文件
- 26. 如何在同一個標記中打開新的jsp頁面
- 27. 如何在Facelet標記中使用默認生成的標識
- 28. 使用標籤庫在JSP
- 29. 如何在JSP中打開PDF文件
- 30. 如何在JSP中打開PDF文件?
抄寫員使用Oauth而不是openId我相信。我在我的所有應用程序中使用抄寫員:) – 2012-02-25 17:17:29
我不使用OpenId我錯誤地認爲OpenId只是另一個使用Oauth的身份提供者,非常多我的錯誤...但是OP想要一種方式來執行SSO,完全致力於OpenId ...因此,我將使用Oauth作爲SSO方法來讀取答案,也許有人會發現它的用處。 – Quaternion 2012-02-25 22:30:34
+1個不錯的例子。我剛剛去OpenId,因爲OP要求像使用開放標識系統的堆棧溢出:)感謝真正的好例子 – 2012-02-26 05:29:20