SSO [ OAuth2.0 ]
1) SSO英文全称Single Sign On,单点登录。
SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。
它是目前比较流行的企业业务整合的解决方案之一。(来源百度词条)
服务器端:
用的GitHub上基于OAuth2.0的sso项目
附github链接 : https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server
用maven 导下来后,部署后就可以直接用了
然后用admin password登录,配置一个client ,设置好client ID ,secret 和redirect url就可以用了
这张图是secret
说明: client ID 和secret任意写,用的时候一致就行了 ,重定向路径 要和 需要使用这个服务的项目的路径一致 ,其他的先用默认值.
然后是测试应用
先上结果(第三方登录返回的json数据 这里只显示了name和email )
应用代码:
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test Single Sign On</title>
</head>
<body style="font-size: 40px">
<a href="${pageContext.request.contextPath}/LoginServlet" >第三方登录</a> </body>
</html>
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function getAccessToken() {
var url = window.location.href;
var start = url.indexOf("#");
var end = url.indexOf("&");
var access_token = url.substring(start+1, end); if (access_token != null) {
var ajax = new XMLHttpRequest();
var url = "AccessServlet";
ajax.open("post", url);
ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
var data = "access_toke="+access_token;
ajax.send(data);
//监听消息
ajax.onreadystatechange = function() {
if (ajax.readyState == 4) {
if (ajax.status == 200) {
var strJSON = ajax.responseText;
var json = JSON.parse(strJSON);
document.getElementById("name").innerHTML = json.name;
document.getElementById("email").innerHTML = json.email;
}
}
}
}
}
getAccessToken();
</script> </head>
<body>
name:<span id ="name"></span>
<br>
email:<span id ="email"></span>
</body>
</html>
CallBackServlet.java
package test_sso; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet("/CallBackServlet")
public class CallBackServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (request.getParameter("code") != null) {
String code = request.getParameter("code");
System.out.println("code=" + code);
String url = "http://localhost:8080/openid-connect-server-webapp/authorize?" + "response_type=token"
+ "&grant_type=" + MyUtil.grant_type + "&code=" + code + "&client_id=" + MyUtil.clientID
+ "&client_secret=" + MyUtil.secret + "&redirect_uri=" + MyUtil.redrictURL;
;
response.sendRedirect(url);
} else {
response.sendRedirect("welcome.jsp");
}
}
}
LoginServlet.java
package test_sso; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String url ="http://localhost:8080/openid-connect-server-webapp/authorize?" +
"response_type=code" +
"&client_id="+MyUtil.clientID+
"&state=ok"+
"redirect_uri="+MyUtil.redrictURL;
response.sendRedirect(url); }
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response); }
}
MyUtil.jsp
package test_sso; import java.io.IOException; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils; import net.sf.json.JSONObject; public class MyUtil {
public static final String clientID = "123123";
public static final String redrictURL = "http://localhost:8080/test_sso/CallBackServlet";
public static final String secret = "hello";
public static final String grant_type = "authorization_code"; public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException {
JSONObject jsonObject = null;
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse reponse = client.execute(httpGet);
HttpEntity entity = reponse.getEntity();
if (entity != null) {
System.out.println("~~~start~~~" + entity + "~~end~~~~~");
String result = EntityUtils.toString(entity, "utf-8");
jsonObject = JSONObject.fromObject(result);
}
httpGet.releaseConnection();
return jsonObject;
}
}
AccessServlet.java
package test_sso; import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONObject;
import net.sf.json.util.JSONUtils; @WebServlet("/AccessServlet")
public class AccessServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String access_toke = request.getParameter("access_toke");
String url = "http://localhost:8080/openid-connect-server-webapp/userinfo?"+access_toke;
JSONObject jsonObject = MyUtil.doGetJson(url);
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.write(jsonObject.toString());
pw.flush();
pw.close(); } }
目录结构
如果对OAuth2.0不了解的,或者不知道这篇文章是干啥,建议先看看大神
阮一峰 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html的博客 .
SSO [ OAuth2.0 ]的更多相关文章
- OAuth2.0 在 SSO中的应用~
关于OAuth2.0的介绍,请看下面链接(讲的挺好的): http://blog.csdn.net/seccloud/article/details/8192707 我的理解: 一共四个角色,A:Cl ...
- iOS OAuth2.0认证和SSO授权
OAuth2.0和SSO授权 一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该 ...
- OAuth2.0和SSO授权
一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该访问令牌访问资源服务器的资源.由于 ...
- OAuth2.0和SSO授权的区别
OAuth2.0和SSO授权 一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该 ...
- OAuth2.0授权和SSO授权
一. OAuth2.0授权和SSO授 1. OAuth2.0 --> 网页 --> 当前程序内授权 --> 输入账号密码 --> (自己需要获取到令牌, 自己处理逻辑) 授权成 ...
- IdentityServer4之SSO(基于OAuth2.0、OIDC)单点登录、登出
IdentityServer4之SSO(基于OAuth2.0.OIDC)单点登录.登出 准备 五个Web站点: 1.localhost:5000 : 认证服务器.2 ...
- (十一) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)
上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...
- sso和oauth2.0的简单了解学习
sso,单点登录,single sign on 缩写.sso多用于多个应用之间的切换,例如百度论坛.百度知道.百度云.百度文库等,在其中一个系统中登录,(登录有效期内)切换到另一个系统的时候,不必再次 ...
- Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)
上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...
随机推荐
- UnitOfWork知多少 【转】
原文链接:https://www.cnblogs.com/sheng-jie/p/7416302.html 1. 引言 Maintains a list of objects affected by ...
- 异步fifo的设计(FPGA)
本文首先对异步 FIFO 设计的重点难点进行分析 最后给出详细代码 一.FIFO简单讲解 FIFO的本质是RAM, 先进先出 重要参数:fifo深度(简单来说就是需要存多少个数据) ...
- Small组件化重构安卓项目
如果从一开始就没有设计好 后面项目业务比较大的时候很难掉头
- 网络编程--广播&组播
广播 1.广播地址 如果用{netid, subnetid, hostid}( {网络ID,子网ID,主机ID})表示IPv4地址.那么有四种类型的广播地址,我们用-1表示所有比特位均为1的字段: 1 ...
- 第二阶段团队冲刺-six
昨天: 完成打印名单的功能. 今天: 合并程序(添加打印txt). 遇到的问题: web.xml中配置url-pattern一直不合适,不知道为什么会影响界面.
- iPhone新建项目不能全屏
上个周做项目的时候,发现新建了一个项目不能全屏.伤透了我的脑筋,然后又请教了团队里其他两个大牛帮我搞定了这个问题. 虽然是搞定了,但也看的出大牛也是云里雾里.歪打正着解决的. 今天又想新做个项目,这个 ...
- ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 M: 当总统
http://acm.ocrosoft.com/problem.php?cid=1316&pid=12 题目描述 小明想当丑国的总统,丑国大选是按各州的投票结果来确定最终的结果的,如果得到超过 ...
- 再理一下prerouting和postrouting等插入点
这些地方的准确翻译是hook点(hook点是一个土的说法,学名叫rule chain,规则链)这些规则链是内核netfilter架构布置在内核里面的,然后iptables是利用了这套基础架构,想起了内 ...
- 二、vue响应式对象
Object.defineProperty Object.defineProperty 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象,先来看一下它的语法: Obj ...
- 刷新iframe
<button onclick="document.getElementById('frame').contentWindow.location.reload(true)"& ...