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 ]的更多相关文章

  1. OAuth2.0 在 SSO中的应用~

    关于OAuth2.0的介绍,请看下面链接(讲的挺好的): http://blog.csdn.net/seccloud/article/details/8192707 我的理解: 一共四个角色,A:Cl ...

  2. iOS OAuth2.0认证和SSO授权

    OAuth2.0和SSO授权   一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该 ...

  3. OAuth2.0和SSO授权

    一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该访问令牌访问资源服务器的资源.由于 ...

  4. OAuth2.0和SSO授权的区别

    OAuth2.0和SSO授权   一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该 ...

  5. OAuth2.0授权和SSO授权

    一. OAuth2.0授权和SSO授 1. OAuth2.0 --> 网页 --> 当前程序内授权 --> 输入账号密码 --> (自己需要获取到令牌, 自己处理逻辑) 授权成 ...

  6. IdentityServer4之SSO(基于OAuth2.0、OIDC)单点登录、登出

    IdentityServer4之SSO(基于OAuth2.0.OIDC)单点登录.登出 准备  五个Web站点: 1.localhost:5000 :                  认证服务器.2 ...

  7. (十一) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  8. sso和oauth2.0的简单了解学习

    sso,单点登录,single sign on 缩写.sso多用于多个应用之间的切换,例如百度论坛.百度知道.百度云.百度文库等,在其中一个系统中登录,(登录有效期内)切换到另一个系统的时候,不必再次 ...

  9. Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)

    上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...

随机推荐

  1. docker部署思路

    1.docker安装2.拉取centos镜像或者Ubuntu镜像 看你用哪个3.使用镜像,run出来一个容器A4.进入容器A,安装uwsgi,把Django部署在下面5.在启动脚本中配置开机自启动脚本 ...

  2. vue常用片段

    事件处理 基本骨架 子组件 axios v-if v-for 路由 设置style 计算属性 动态class 路由跳转 store nextTick 事件处理: 直接写表达式:   @click=&q ...

  3. python XlsxWriter创建Excel 表格

    文档(英文) https://xlsxwriter.readthedocs.io/index.html 常用模块说明(中文) https://blog.csdn.net/sinat_35930259/ ...

  4. 冒泡排序js

    //    冒泡排序     var a = [1,3,2,4,5,3,2,1,4,6,7,7,6,6];     var b =[];     for(var i=0;i<a.length;i ...

  5. 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割

    题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...

  6. [洛谷P3810]【模板】三维偏序(陌上花开)

    题目大意:有$n$个元素,第$i$个元素有三个属性$a_i,b_i,c_i$,设$f(i)=\sum\limits_{i\not = j}[a_j\leqslant a_i,b_j\leqslant ...

  7. bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割

    1266: [AHOI2006]上学路线route Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2490  Solved: 898[Submit][S ...

  8. Mysql 乱码配置

    转自: http://www.ha97.com/5359.html 一.登录MySQL查看用SHOW VARIABLES LIKE ‘character%’;下字符集,显示如下: +--------- ...

  9. InnoDB的多版本并发控制(MMVC)

    InnoDB的MVCC之(乐观锁),是通过在每行记录保存两个隐藏列来实现的.这两个列,一个是存创建时间,一个是删除时间,这里的时间指的是,系统版本号,并不是真正的时间值. 每开始一个新的事务,系统版本 ...

  10. OpenCV 2.4.9 学习笔记(4)—— 像素类型与Templates的限制使用

    限制使用templates C++中的Templates使得接口机制非常好用,高效而且能够保证数据与算法的安全.但是过多地使用templates可能会增加计算时间和代码长度,有时候还能难区分接口和实现 ...