Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1126|回复: 0

跨服务器登录验证(单点登录SSO)过程和Java实现 实例

[复制链接]

该用户从未签到

发表于 2011-9-21 21:13:59 | 显示全部楼层 |阅读模式
如果我们的网站需要和另一个域名做统一认证,也就是在我们网站登录,但真正的功能却在另一个网站来提供。许多都以 passport 的方式。

整个认证可以分三步完成

第一步:本地验证

这个很简单,输入本地的用户名和密码,然后服务器认证通过,并返回正确的Cookie;

第二步:做远程认证,并返回远程连接

通过本地Cookie,确认用户合法性,然后服务器端调用远程的登录程序,返回一个远程认证号的URL,这个URL里面包含了一个唯一的认证码,使用Location的方式
  

第三步:远程登录

客户端使用前一步的URL,访问远程的服务器,服务器确认认证码的正确性,再返回正确的远程Cookie.

至此,本地认证,通过一个URL,实现了远程认证。

以下是师范代码,是Verycd的武林英雄的认证过程,其登录服务是verycd提供的,而真实服务时9wee提供的。
  1. package org.javaren.hero;
  2. import java.io.BufferedReader;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.net.Socket;
  7. import java.net.URLEncoder;
  8. import java.util.Scanner;
  9. /**
  10. * 跨服务器登录验证(单点登录SSO)的过程和Java实现
  11. *
  12. * @author JAVA世纪网(java2000.net, laozizhu.com)
  13. */
  14. public class Login {
  15.   public static String getCookie() {
  16.     System.out.print("输入用户名:");
  17.     Scanner in = new Scanner(System.in);
  18.     String username = in.next();
  19.     System.out.print("输入密码:");
  20.     String password = in.next();
  21.     try {
  22.       // 本地认证
  23.       String cookie = postLogin(username, password);
  24.       if (cookie == null) {
  25.         return null;
  26.       }
  27.       // 服务器远程认证
  28.       String url = getLogin2(cookie);
  29.       if (url == null) {
  30.         return null;
  31.       }
  32.       // 远程访问认证
  33.       String cookie2 = getLogin3(url.substring("http://s4.verycd.9wee.com".length()));
  34.       // System.out.println(cookie2);
  35.       return cookie2;
  36.     } catch (Exception ex) {
  37.       ex.printStackTrace();
  38.       return null;
  39.     }
  40.   }
  41.   private static String postLogin(String username, String password) throws Exception {
  42.     Socket socket = new Socket("secure.verycd.com", 80);
  43.     try {
  44.       StringBuilder sb = new StringBuilder();
  45.       sb.append("POST /signin?f=out HTTP/1.1\r\n");
  46.       sb.append("Host: secure.verycd.com\r\n");
  47.       sb.append("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3\r\n");
  48.       sb.append("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
  49.       sb.append("Accept-Language: zh-cn,zh;q=0.5\r\n");
  50.       sb.append("Accept-Encoding: gzip,deflate\r\n");
  51.       sb.append("Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7\r\n");
  52.       sb.append("Referer: http://secure.verycd.com/3rdServices/50hero\r\n");
  53.       sb.append("Content-Type: application/x-www-form-urlencoded\r\n");
  54.       String data = "ru=http%3A%2F%2Fsecure.verycd.com%2F3rdServices%2F50hero&login_submit=%E7%99%BB%E5%BD%95&username="
  55.           + URLEncoder.encode(username, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8");
  56.       sb.append("Content-Length: " + data.getBytes("UTF-8").length + "\r\n");
  57.       sb.append("\r\n");
  58.       sb.append(data);
  59.       OutputStream os = socket.getOutputStream();
  60.       os.write(sb.toString().getBytes("UTF-8"));
  61.       os.flush();
  62.       InputStream is = socket.getInputStream();
  63.       BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); // 读取结果
  64.       String line;
  65.       StringBuilder cookieSb = new StringBuilder();
  66.       int index;
  67.       while ((line = reader.readLine()) != null) {
  68.         if (line.startsWith("Set-Cookie:")) {
  69.           if (!line.contains("=deleted;")) {
  70.             index = line.indexOf(";");
  71.             if (index > 12) {
  72.               cookieSb.append(line.substring(12, index + 1));
  73.             }
  74.           }
  75.         } else if (line.startsWith("location:")) {
  76.           if (line.contains("error_code")) {
  77.             return null;
  78.           }
  79.         }
  80.       }
  81.       is.close();
  82.       reader.close();
  83.       return cookieSb.toString();
  84.     } finally {
  85.       socket.close();
  86.     }
  87.   }
  88.   private static String getLogin2(String cookie) throws Exception {
  89.     Socket socket = new Socket("secure.verycd.com", 80);
  90.     try {
  91.       StringBuilder sb = new StringBuilder();
  92.       sb.append("GET /signin?ak=50hero&ru=http%3A%2F%2Fs4.verycd.9wee.com%2Fpassport.php HTTP/1.1\r\n");
  93.       sb.append("Host: secure.verycd.com\r\n");
  94.       sb.append("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3\r\n");
  95.       sb.append("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
  96.       sb.append("Accept-Language: zh-cn,zh;q=0.5\r\n");
  97.       sb.append("Accept-Encoding: gzip,deflate\r\n");
  98.       sb.append("Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7\r\n");
  99.       sb.append("Referer: http://secure.verycd.com/3rdServices/50hero\r\n");
  100.       sb.append("Cookie: " + cookie + "\r\n");
  101.       sb.append("\r\n");
  102.       OutputStream os = socket.getOutputStream();
  103.       os.write(sb.toString().getBytes("UTF-8"));
  104.       os.flush();
  105.       InputStream is = socket.getInputStream();
  106.       BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); // 读取结果
  107.       String line;
  108.       while ((line = reader.readLine()) != null) {
  109.         if (line.startsWith("location:")) {
  110.           return line.substring(10);
  111.         }
  112.       }
  113.       is.close();
  114.       reader.close();
  115.       return null;
  116.     } finally {
  117.       socket.close();
  118.     }
  119.   }
  120.   private static String getLogin3(String url) throws Exception {
  121.     Socket socket = new Socket("s4.verycd.9wee.com", 80);
  122.     try {
  123.       StringBuilder sb = new StringBuilder();
  124.       sb.append("GET " + url + " HTTP/1.1\r\n");
  125.       sb.append("Host: s4.verycd.9wee.com\r\n");
  126.       sb.append("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3\r\n");
  127.       sb.append("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
  128.       sb.append("Accept-Language: zh-cn,zh;q=0.5\r\n");
  129.       sb.append("Accept-Encoding: gzip,deflate\r\n");
  130.       sb.append("Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7\r\n");
  131.       sb.append("Referer: http://secure.verycd.com/3rdServices/50hero\r\n");
  132.       sb.append("\r\n\r\n");
  133.       OutputStream os = socket.getOutputStream();
  134.       os.write(sb.toString().getBytes("UTF-8"));
  135.       os.flush();
  136.       InputStream is = socket.getInputStream();
  137.       BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); // 读取结果
  138.       String line;
  139.       StringBuilder cookieSb = new StringBuilder();
  140.       int index;
  141.       while ((line = reader.readLine()) != null) {
  142.         if (line.length() == 0) {
  143.           break;
  144.         }
  145.         if (line.startsWith("Set-Cookie:")) {
  146.           index = line.indexOf(";");
  147.           if (index > 12) {
  148.             cookieSb.append(line.substring(12, index + 1));
  149.           }
  150.         }
  151.       }
  152.       is.close();
  153.       reader.close();
  154.       return cookieSb.toString();
  155.     } finally {
  156.       socket.close();
  157.     }
  158.   }
  159. }
  160.                   
复制代码
回复

使用道具 举报

该用户从未签到

发表于 2011-9-28 13:02:07 | 显示全部楼层
谢谢啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-6-2 06:33 , Processed in 0.366325 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表