晓夏

小皇

教育信息化方案砖家

PHP使用上海交大Jaccount OAuth2.0 认证机制

浏览量:976

if(!$_SESSION['HTTP_REFERER']){
	$_SESSION['HTTP_REFERER'] = $_SERVER['HTTP_REFERER'];
}
if(isset($_SESSION['jaccount'])){//登录成功后
	header("Location:".$_SESSION['HTTP_REFERER']);
}

首页在头部写上这段代码,就是如果检测到已经登录,则跳转回来源页面(有时候长时间页面不操作会自动掉出自己网页的session)

function request_post($url = '', $post_data = array())
	{
		if (empty($url) || empty($post_data)){return false;}
		$o = "";
		foreach ($post_data as $k => $v){$o .= $k . "=" . $v . "&";}
		$post_data = substr($o, 0, -1);
		
		$postUrl = $url;
		$curlPost = $post_data;
		$ch = curl_init();//初始化curl
		curl_setopt($ch, CURLOPT_URL, $postUrl); // 要访问的地址
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
		curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
		curl_setopt($ch, CURLOPT_POST, 1); // 发送一个常规的Post请求
		curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); // Post提交的数据包
		curl_setopt($ch, CURLOPT_TIMEOUT, 5); // 设置超时限制防止死循环
		curl_setopt($ch, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
		
		$data = curl_exec($ch);//运行curl
		if (curl_errno($ch)){echo 'Errno' . curl_error($ch);}//捕抓异常 
		curl_close($ch);
		return $data;
	}
	
function request_get($url = '')
	{
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
		curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
		curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
		curl_setopt($ch, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
		
		$data = curl_exec($ch);//运行curl
		if (curl_errno($ch)){echo 'Errno' . curl_error($ch);}//捕抓异常
		curl_close($ch);
		return $data;
	}


上面的两个函数是必须的,要发送post请求和get请求

header("Location: https://jaccount.sjtu.edu.cn/oauth2/authorize?response_type=code&client_id=fzEOiPKtsiGV98BlzMTY92bI&redirect_uri=http://www.umji.sjtu.edu.cn/jaccount.php");

上面这个代码是去获取CODE,从哪个页面发起的,redirect_uri是回调地址:处理获取到的CODE,client_id是交大给的

if(isset($_GET['code'])) {
    $auth_code = $_GET['code'];
    $url = 'https://jaccount.sjtu.edu.cn/oauth2/token';
	$post_data = array(
		'grant_type'    => 'authorization_code',
		'code'          => $auth_code,
		'redirect_uri'  => 'http://www.umji.sjtu.edu.cn/jaccount.php',
		'client_id'     => 'fzEOiPKtsiGV98BlzMTY92bI',
		'client_secret' => '6B7589C8DE570803B7589DC07B951C20D'
	);
    $token_json = request_post($url, $post_data);  //获取token
	$token_info = json_decode($token_json); //把token转化成object
    $url = "https://api.sjtu.edu.cn/v1/me/profile?access_token=".$token_info->access_token;
	$usr_json = request_get($url); //执行get个人属性
    $usr_info = json_decode($usr_json);
	
    $_SESSION["user"]=$usr_info->entities[0]->code;//获取这个学号或工号
	$_SESSION['jaccount']=array('id'=>$usr_info->entities[0]->code,'uid'=>$usr_info->entities[0]->account,'chinesename'=>$usr_info->entities[0]->name,'type'=>$usr_info->entities[0]->userType,'dept'=>$usr_info->entities[0]->organize->name);
	
    if(isset($_SESSION['jaccount'])){//登录成功后
	header("Location:".$_SESSION['HTTP_REFERER']);
    }else{
	header("Location:/");
    }
}


神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。