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

64 篇文章 1 订阅

如果我们的网站需要和另一个域名做统一认证,也就是在我们网站登录,但真正的功能却在另一个网站来提供。许多都以 passport 的方式。

 

整个认证可以分三步完成

 

第一步:本地验证

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

 

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

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

 

第三步:远程登录

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

 

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

 

以下是师范代码,是Verycd的武林英雄的认证过程,其登录服务是verycd提供的,而真实服务时9wee提供的。

 

[java]  view plain copy
  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. }  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值