1. 程式人生 > >php+ajax實現跨域單點登入

php+ajax實現跨域單點登入

php和ajax具體實現單點登入。

在本次示例中我們需要兩個站點:

www.onmpw.com
www.onmpw1.com

當然還有一個驗證系統

www.SSOsite.com

為了實現單點登入。首先,我們需要將要設定兩個站點使其共享session。至於如何共享session,可以參考《PHP叢集session共享》這篇文章。這裡我們就不做詳細的介紹了。

假設我們已經設定了二者可以共享session了。下面我們就來介紹具體實現的流程。

第一部分

下面我們用文字來描述該過程

·瀏覽器請求onmpw的需要驗證的頁面。

·通過ajax請求SSOsite系統,檢視是否存在SSOsite站點的cookie

資訊,如果不存在則通知瀏覽器需要進行登入。

·瀏覽器接收到需要登入的資訊後請求onmpw的登入頁面(當然有的系統是統一使用SSOsite的登入系統,那就需要瀏覽器再去請求SSOsite的登入頁面了)。

·提交登入資訊到onmpw系統。onmpw系統通過curl技術將登入資訊傳送給SSOsite系統進行驗證。

curl_setopt($ch, CURLOPT_URL, "www.SSOsite.com/?c=Auth&a=authUser");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('username'=>$username,'password'=>$password));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$res = json_decode($data);

·SSOsite驗證成功以後,生成token,並將使用者資訊連同生成的token一併返回給onmpw系統。

const chars = 'abcdefgABCDEFG012hijklmnHIJKLMN3456opqrstOPQRST789UVWXYZuvwxyz';
static public function str_random(){
     //隨機生成token串
     $chars = self::chars;
     $token = '';
     for($i = 0; $i < 5; $i++){
        $str = substr($chars,0,mt_rand(0, strlen($chars)-1));
        $token .= $str.$chars[mt_rand(0, strlen($str)-1)];
     }
     $token = md5($token);
     return $token;
 }

·onmpw接收到SSOsite返回的驗證成功的資訊以後,將使用者資訊寫入瀏覽器的cookie中。最後將登入成功的資訊響應給瀏覽器。

setcookie('userid',$res->userid,null,'/');    //設定本站點cookie

·然後瀏覽器再次通過ajax將得到的token傳送給SSOsite。

checkToken:function(args){
         $.ajax({
                   url:Onmpw_SSO.Configure.SSO_Server+'/?c=Auth&a=checkToken',
                   xhrFields: {withCredentials: Onmpw_SSO.Configure.Cross_Domain},
                   dataType:'json',
                   type:'post',
                   data:{token:args.token,userid:args.userid},
                   success:function(data){
                            args.Suc();
                   },
                   error:function(err){
                            console.log(err);
                   }
         })
},

SSOsite得到token以後將token存入瀏覽器端cookie和session中。

public function checkToken(){
      $this->authUrl();
      session_start();
      if(isset($_POST['token'])){
          setcookie('usertoken',$_POST['token'],null);
          setcookie('userid',$_POST['userid'],null);
          $_SESSION['token'] = $_POST['token'];
          echo json_encode(array('auth'=>'SUC'));
      }
 }

注意在瀏覽器通過ajax向SSOsite傳送請求的情況下需要設定CORS(跨域資源共享)

private function authUrl(){
        $origin = $_SERVER['HTTP_ORIGIN'];
        if (in_array($origin, $this->urlArr)) {
            header("Access-Control-Allow-Origin:" . $origin);
            header("Access-Control-Allow-Credentials: true ");
        }else{
            echo "error!";
            exit;
        }
    }

設定完成以後,返回瀏覽器登入成功。

第二部分

下面我們用文字描述該過程

·瀏覽器請求onmpw的需要驗證的頁面。

·通過ajax帶著cookie資訊請求SSOsite系統。SSOsite系統在cookie中提取使用者token。然後再次生成一個臨時token存入session中,其鍵名為使用者token。最後通知瀏覽器該使用者已經登入成功,並且將臨時token一併返回給瀏覽器。

$tmptoken = \Common::str_random();
$_SESSION[$_SESSION['token']] = $tmptoken;

·瀏覽器接收到臨時token,然後再次通過ajax將臨時token傳送給SSOsite進行驗證。SSOsite驗證完成臨時token,將session中的臨時token銷燬。並且得到自己的sessionId返回給瀏覽器。

public function authToken(){
    $this->authUrl();
    session_start();
    $tmptoken = $_POST['tmptoken'];
    if($tmptoken == $_SESSION[$_SESSION['token']]){
        unset($_SESSION[$_SESSION['token']]);
        echo json_encode(array('auth'=>'SUC','userid'=>$_COOKIE['userid'],'sessionId'=>session_id()));
    }else{
        echo json_encode(array('auth'=>'FAIL'));
    }
 }

·瀏覽器收到SSOsite返回的sessionId以後,將sessionId傳送給onmpw。onmpw系統接收到瀏覽器帶來的sessionId以後,用此sessionId來初始化自身的session。將先前存入瀏覽器cookie中的使用者資訊存入session中並且銷燬cookie資訊(當然在session開啟之後,我們先檢查session中是否存在使用者資訊,如果不存在則將cookie中的使用者資訊存入session,並銷燬cookie)。

$sessionId = $_POST['sessionId'];
session_id($sessionId);
session_start();
if(!isset($_SESSION['userid'])){
    $userid = $_COOKIE['userid'];
    setcookie('userid',"",time()-3600,'/');
    $_SESSION['userid'] = $userid;
}

·這樣瀏覽器就可以知道使用者資訊存在,進行相應的操作。在第一部分步驟完成以後,使用者也可以請求onmpw1。其步驟是和第二部分描述的相同。

至此,通過php和ajax實現的流程已經全部完成。

相關推薦

php+ajax實現登入

php和ajax具體實現單點登入。 在本次示例中我們需要兩個站點: www.onmpw.com www.onmpw1.com 當然還有一個驗證系統 www.SSOsite.com 為了實現單點登入。首先,我們需要將要設定兩個站點使其共享session。至於如何共享sessi

SSO登入實現方案

SSO簡介 定義: 傳統的單站點登入訪問授權機制是:登入成功後將使用者資訊儲存在session中,sessionId儲存在cookie中,每次訪問需要登入訪問的資源(url)時判斷當前session是否為空,為空的話跳轉到登入介面登入,不為空的話允許訪問。  單點登入是一種多站

Cookie實現登入

[javascript] view plain copy print? Cookie 同域單點登入  最近在做一個單點登入的系統整合專案,之前我們使用控制元件實現單點登入(以後可以介紹一下)。但現在為了滿足客戶需求,在不使用控制元件情況下實現單點登入,先來介紹一下單點登入。  單點登入:多個不同

登入實現

       本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20545513,轉載請註明。        完全跨域的單點登入實現方案基本和上篇文章介紹的一樣,只不過生成ticket的過程更復雜些。上篇文章中的專案是不能完全跨域的,

SSO-C#登入(一)

開篇就是定義Model,資料為先: public class Something { public const string CookieName = "User"; public const double TimeOut = 1

ucenter實現登陸的方法

<?php /** * 1.每一個應用都要包含uc_client,下面拿uchome程式碼舉例 * 2.uchome登陸時訪問source/do_login.php 的getpassport函式,getpassport通過uc_client 直接連ucenter的

據說是springboot下實現cas的登入(但是我總感覺是MVC)----基於前後臺分離的

一、前言 前後端分離開發是目前軟體開發的主流,大大提高了開發效率  但也帶來了很多不方便之處。 1、優點:  ① 傳統全棧開發的 MVC 模式將不適合,後臺採取 MVP 面向介面程式設計,耦合度大大降低 2、缺點:  ① 跨域問題不勝其擾 3、原則:&n

php ajax jsonp 兩種方式

第一種方式客戶端程式碼案例 第一種方法重點是服務端加header頭------》header("Access-Control-Allow-Origin: *"); 客戶端程式碼 header("Access-Control-Allow-Origin: *"); $data = $r

基於EasyNVR攝像機無外掛直播流媒體伺服器實現類似於登入功能的免登入直播功能

提出問題 EasyNVR是一套攝像機無外掛直播的流媒體伺服器軟體,他可以接入各種各樣的攝像機,再經過轉化統一輸出無外掛化直播的RTMP、HLS、HTTP-FLV流,同時,EasyNVR為了資料安全,提供了鑑權功能,可以配置成只有登入後才能直播觀看: 但這個時候問題又來了,很多企

完全下單登入的一種解決方案

  根據oums單點登入解決方案介紹 一文我們知道單點登入有兩種模型,一種是共同父域下的單點登入(例如域名都是 xx.a.com),還有就是完全跨域下的單點登入(例如域名是xx.a.com,xx.b.com),本文我們講一下完全跨域下的單點登入該怎麼實現。  

HttpClient和HtmlParser配合實現自動CAS登入系統抽取頁面資訊

httpclient下載地址:http://mirror.bit.edu.cn/apache//httpcomponents/httpclient/binary/httpcomponents-client-4.5.1-bin.zip 專案中引入所有的jar包,然後看下面的

Java實現的SSO登入

原理 在網上找了很多SSO 框架,不是太複雜就是侵入式的,比如CAS,josso,後為想還是自己寫一個吧,反正不難。以下記錄一下,希望對大家有用. 1:產生背景 想像一下,一家企業從無資訊化系統開始著手實現自己公司的資訊化,假如這家公司有自己的IT團隊,第一個系統公

[jQuery]Ajax實現訪問JSON

Ajax跨域訪問JSON 環境:.net4.0+jQuery+JSON.net 因為在跨域實現,所以這裡新建網站,這個網站只需要Ashx檔案 public void ProcessRequest(HttpContext context) { stringstrJs

shiro+cas+spring-data-redis實現多系統登入和分散式專案的session同步

CSDN開通很久了,但是一直沒寫東西,2018年了,這是我CSDN的第一篇文章,歡迎各位評論探討和指點。   一、背景: 現在公司的業務系統要做多臺分散式叢集,由於是web專案,要做session同步,想到的方案是用目前火熱的redis資料庫儲存session,還有業

Java使用cookie實現簡單的登入功能

(一)取得cookie中的相關資訊Cookie[]cookies = request.getCookies();   Stringusername = "";   Stringpassword = "";   i

java實現簡單的登入

摘要:單點登入(SSO)的技術被越來越廣泛地運用到各個領域的軟體系統當中。本文從業務的角度分析了單點登入的需求和應用領域;從技術本身的角度分析了單點登入技術的內部機制和實現手段,並且給出Web-SSO和桌面SSO的實現、原始碼和詳細講解;還從安全和效能的角度對現

java中cookie的操作(通過cookie實現簡單的登入

package com.njupt.sso.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.h

java用ajax實現上傳圖片

說明 : 圖片伺服器是用Nginx搭建的,用的是Php語言 這個功能 需要 用到兩個js檔案: jquery.js和jquery.form.js <script type="text/javascript" src="js/jquery.js"></scr

cookie實現登入

Cookie 跨域,實現單點登入 Table title 最近在做一個單點登入的系統整合專案,之前我們使用控制元件實現單點登入(以後可以介紹一下)。但現在為了滿足客戶需求,在不使用控制元件情況下實現單點登入,先來介紹一下單點登入。 單點登入:多個不同系統整合

jquery 非同步請求 自定義頭部 預檢請求 spring mvc攔截處理 實現token登入

被跨域搞死了,各種奇葩問題。 問題描述:跨域登入,生成token並儲存到redis中,然後返回給客戶端,客戶端每次請求需要將token放到請求頭中傳給服務端,服務端使用過濾器處理跨域攔截,使用攔截器判斷token有效性。問題來了,發來的請求總是獲取不到頭部資訊,也就是取不到