`

绑定QQ登录 PHP OAuth详解

阅读更多

越来越多的网站开始采用 第三方账号登录 如qq 微博 开心网 等诸多流行的社交平台

利用第三方账号登录,可以更好地省去用户的注册时间,并且极大地提高用户体验,吸引更多的潜在用户。

让用户拥有 一个号码走web天下的感觉。。。

对我们开发者来说 这也是一个主要的学习新知识点 主要原理即Oauth。

 

 

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。

 步骤详细介绍

 

1.去qq、微博的第三方开发平台 去review一下他们的API

2.申请AppId和AppKey ,对于qq来说 网址 http://connect.opensns.qq.com/ 点击首页的 <网站接入>

注册自己的开发者信息 随便百度一下 输入一个备案号 即可 然后我们就可以获得 AppId和AppKey

3.然后就是编写代码

<?php
/**
 * 申请http://connect.opensns.qq.com/apply
 * 列表http://connect.opensns.qq.com/my
 */
session_start();
$qq_oauth_config = array(
	'oauth_consumer_key'=>'*******',//APP ID
	'oauth_consumer_secret'=>'******************',//APP KEY
	'oauth_callback'=>"http://www.955.cc/qq.php?action=reg",//这里修改为当前脚本
	'oauth_request_token_url'=>"http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token",
	'oauth_authorize_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize',
	'oauth_request_access_token_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token',
	'user_info_url' => 'http://openapi.qzone.qq.com/user/get_user_info',
);
$action = isset($_GET['action']) ? $_GET['action'] : '';


$qq = new qq_oauth($qq_oauth_config);
switch($action){
	//用户登录 Step1:请求临时token
	case 'login':
		$token = $qq->oauth_request_token();
		$_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];
		$qq->authorize($token['oauth_token']);
	break;
	//Step4:Qzone引导用户跳转到第三方应用
	case 'reg':
		$qq->register_user();
		$access_token = $qq->request_access_token();
		if($token = $qq->save_access_token($access_token)){
			//保存,一般发给用户cookie,以及用户入库
			//var_dump($token);
			$_SESSION['oauth_token'] = $token['oauth_token'];
			$_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];
			$_SESSION['openid'] = $token['openid'];
			header('Content-Type: text/html; charset=utf-8');
			$user_info = json_decode($qq->get_user_info());
			if($user_info->ret!=0){
				exit("获取头像昵称时发生错误".$user_info->msg);
			} else {
				echo 'QQ昵称:',$user_info->nickname,
				'<img src="',$user_info->figureurl,'" />',
				'<img src="',$user_info->figureurl_1,'" />',
				'<img src="',$user_info->figureurl_2,'" />';
			}
			
		}
	break;
	default :
}


class qq_oauth{
	private $config;
	function __construct($config){
		$this->config = $config;
	}
	/**
	 * 返回配置
	 * @param string $name
	 * 
	 */
	function C($name){
		return isset($this->config[$name]) ?  $this->config[$name] : FALSE;
	}
	/**
	 * 构建请求URL
	 * @param string $url
	 * @param array $params
	 * @param string $oauth_token_secret
	 * 
	 */
	function build_request_uri($url,$params=array(),$oauth_token_secret=''){
		$oauth_consumer_key = $this->C('oauth_consumer_key');
		$oauth_consumer_secret = $this->C('oauth_consumer_secret');
		
		$params = array_merge(array(
			'oauth_version'=>'1.0',
			'oauth_signature_method'=>'HMAC-SHA1',
			'oauth_timestamp'=>time(),
			'oauth_nonce'=>rand(1000,99999999),
			'oauth_consumer_key'=>$oauth_consumer_key,
		),$params);
		$encode_params = $params;
		ksort($encode_params);
		$oauth_signature = 'GET&'.urlencode($url).'&'.urlencode(http_build_query($encode_params));
		$oauth_signature = base64_encode(hash_hmac('sha1',$oauth_signature,$oauth_consumer_secret.'&'.$oauth_token_secret,true));
		$params['oauth_signature'] = $oauth_signature;
		return $url.'?'.http_build_query($params);
	}
	/**
	 * 校验回调是否返回约定的参数 
	 */
	function check_callback(){
		if(isset($_GET['oauth_token']))
			if(isset($_GET['openid']))
				if(isset($_GET['oauth_signature']))
					if(isset($_GET['timestamp']))
						if(isset($_GET['oauth_vericode']))
							return true;
		return false;
	}
	
	function get_contents($url){
		$curl = curl_init();
		curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
		curl_setopt($curl,CURLOPT_URL,$url);
		return curl_exec($curl);
	}
	/**
	 * Step1:请求临时token、Step2:生成未授权的临时token
	 */
	function oauth_request_token(){
		$url = $this->build_request_uri($this->C('oauth_request_token_url'));
		$tmp_oauth_token = $this->get_contents($url);
		parse_str($tmp_oauth_token);
		/*
		oauth_token	未授权的临时token
		oauth_token_secret	token的密钥,该密钥仅限于临时token
		error_code	错误码
		*/
		if(isset($error_code)) exit($error_code);
		return array(
			'oauth_token'=>$oauth_token,
			'oauth_token_secret'=>$oauth_token_secret
		);
	}
	/**
	 * Step3:引导用户到Qzone的登录页
	 * @param string $oauth_token 未授权的临时token
	 */
	function authorize($oauth_token){
		$str = "HTTP/1.1 302 Found";
		header($str);
		$url = $this->C('oauth_authorize_url');
		$query_strings = http_build_query(array(
			'oauth_consumer_key'=>$this->C('oauth_consumer_key'),
			'oauth_token'=>$oauth_token,
			'oauth_callback'=>$this->C('oauth_callback'),
		));
		header('Location: '.$url.'?'.$query_strings);
	}
	/**
	 * Step4:Qzone引导用户跳转到第三方应用
	 * @return bool 验证是否有效 
	 */
	function register_user(){
		/*
		 * oauth_token	已授权的临时token
		 * openid	腾讯用户对外的统一ID,该OpenID与用户QQ号码一一对应
		 * oauth_signature	签名值,方便第三方来验证openid以及来源的可靠性。
		 * 		使用HMAC-SHA1算法:
		 * 		源串:openid+timestamp(串中间不要添加'+'符号)
		 * 		密钥:oauth_consumer_secret
		 * timestamp	openid的时间戳
		 * oauth_vericode	授权验证码。
		 */
		if($this->check_callback()){
			//校验签名
			$signature = base64_encode(hash_hmac('sha1',$_GET['openid'].$_GET['timestamp'],$this->C('oauth_consumer_secret'),true));
			if(!empty($_GET['oauth_signature']) && $signature==$_GET['oauth_signature']){
				$_SESSION['oauth_token'] = $_GET['oauth_token'];
				$_SESSION['oauth_vericode'] = $_GET['oauth_vericode'];
				return;
			}
		}
		//校验未通过
		exit('UNKNOW REQUEST');
	}
	/**
	 * Step5:请求access token 
	 */
	function request_access_token(){
		$url = $this->build_request_uri($this->C('oauth_request_access_token_url'),array(
			'oauth_token'=>$_SESSION['oauth_token'],
			'oauth_vericode'=>$_SESSION['oauth_vericode']
		),$_SESSION['oauth_token_secret']);
		return $this->get_contents($url);
	}
	/**
	 * Step6:生成access token (保存access token)
	 * 
	 * 关于access_token
	 * 目前access_token(及其secret)是长期有效的,和某一个openid对应,目前可以支持线下获取该openid的信息。 
	 * 当然,用户有权限在Qzone这边删除对第三方的授权,此时该access_token会失效,需要重新走整个流程让用户授权。
	 * 以后会逐步丰富access_token的有效性,长期有效、短期有效、用户登录时才有效等。
	 */
	function save_access_token($access_token_str){
		parse_str($access_token_str,$access_token_arr);
		if(isset($access_token_arr['error_code'])){
			return FALSE;
		} else {
			return $access_token_arr;
		}
	}
	/**
	 * 目前腾讯仅开放该API
	 * 获取登录用户信息,目前可获取用户昵称及头像信息。
	 * http://openapi.qzone.qq.com/user/get_user_info
	 */
	function get_user_info(){
		$url = $this->build_request_uri($this->C('user_info_url'),array(
			'oauth_token'=>$_SESSION['oauth_token'],
			'openid'=>$_SESSION['openid'],
		),$_SESSION['oauth_token_secret']);
		return $this->get_contents($url);
	}
}

 

分享到:
评论

相关推荐

    ecmall一键登录功能,QQ支持oauth2.0

    **二、QQ登录OAuth2.0详解** OAuth2.0是一种授权框架,它允许第三方应用在用户授权的情况下,获取到其在特定服务提供商(如QQ)的特定信息。在Ecmall中,我们需按照QQ开放平台的OAuth2.0流程进行操作: 1. **注册...

    QQ登陆接口

    ### QQ登录接口详解 QQ登录接口为用户提供了一种便捷的方式,允许用户通过其QQ账号登录第三方网站或应用,简化了用户的注册与登录流程。本文档将深入解析QQ登录的实现步骤,包括申请接入、配置环境、接口调用及其...

    thinkphp5 QQ互联登录包 QQ登录插件

    《ThinkPHP5集成QQ互联登录插件详解》 在当今互联网时代,用户登录方式多样化,QQ登录作为一种便捷的社交账号登录方式,深受广大用户的喜爱。本文将详细介绍如何在基于ThinkPHP5(简称TP5)的项目中实现QQ互联登录...

    关于调取微信QQ支付宝第三方登录

    2. 支付宝和微信在获取oauth token的返回json分别会带UserId和unionid,这两个字段对应的是支付宝和微信的唯一用户ID,QQ的要多一步,在拿到oauth code 后去请求me这个接口才能拿到user id。 3. 在拿到第三方平台的...

    网上牛人用python 写的qq模拟器

    【Python QQ模拟器详解】 在IT领域,Python以其简洁易读的语法和强大的库支持而备受程序员喜爱。在这个项目中,我们关注的是一个由网络上的技术爱好者利用Python编写的QQ模拟器。这个模拟器展示了Python在图形用户...

    ecshop 第三方登录带后台

    **ECSHOP 第三方登录集成详解** ECSHOP是一款流行的开源电子商务系统,它为商家提供了构建在线商店的强大功能。在当今数字化时代,为了提供更便捷的用户体验,许多电商平台开始支持第三方登录服务,比如QQ、新浪...

    .net Web Api使用详解(全部实例讲解,可直接运行看效果)

    - 支持简单类型和复杂类型的绑定,如查询字符串、请求体、路由数据。 6. **返回结果(Response)** - `Ok()`返回HTTP 200状态码,包含数据。 - `BadRequest()`表示无效的请求,通常用于验证错误。 - `Created()...

    java SrpingMVC图书管理系统

    《Java SpringMVC 图书管理系统实现详解》 Java SpringMVC 图书管理系统是一个基于Web的综合性应用,旨在高效管理图书信息,提供用户友好的界面,同时融入了人脸识别和QQ登录等创新功能,使得系统的安全性和用户...

    Django项目.pdf

    QQ登录采用OAuth2.0认证协议,获取openid并检查是否已绑定用户,未绑定时进行绑定操作。 ### 3. 商品模块 - **商品数据库设计**:包括SPU(标准化产品单元)和SKU(库存量单位)的概念,以及广告和商品信息数据库表...

    微信第三方登录

    9. demo详解 提供的"weiLogin"压缩包可能包含了实现微信第三方登录的代码示例,包括前端和后端接口。前端部分主要负责引导用户授权并处理回调,后端部分则负责与微信服务器交互,获取并验证access_token,以及处理...

    joomla第三方登录开发过程

    ### Joomla第三方登录开发详解 #### 一、概述 在当今互联网时代,为了提高用户体验和方便用户登录,许多网站都引入了第三方登录功能。对于使用Joomla构建的网站来说,实现第三方登录同样非常重要。本文将详细介绍...

    适用于thinkphp5.1 thinkphp6.0的社会化登录扩展.zip

    《基于ThinkPHP5.1与ThinkPHP6.0的社会化登录扩展详解》 在现代Web应用开发中,用户可以通过各种社交媒体账号进行快捷登录,这种方式被称为社会化登录。在PHP框架ThinkPHP5.1和ThinkPHP6.0中,为了实现这种功能,...

    Android挑战赛项目一个基于大学生竞赛信息分享组队平台.zip

    【知识点详解】 1. **Android开发环境**:项目基于Android Studio,这是Google提供的官方Android应用开发工具,包含了集成开发环境(IDE)、构建系统、调试工具等,使得开发者能够高效地创建和测试Android应用。 2...

    最强找茬小程序源码修复版,已更新微信授权

    《最强找茬小程序源码修复版详解》 在微信小程序的开发领域,一款名为“最强找茬”的小程序因其趣味性和互动性受到了用户的喜爱。本文将深入解析修复版的“最强找茬”小程序源码,帮助开发者更好地理解其背后的实现...

    asp.net简单网上商业网站源码

    - 在商业网站中,可能会有对外提供的接口或API,如`yidenglu.aspx`,这可能是第三方登录(如微信、QQ等)的接口实现,利用OAuth协议进行身份验证。 总结来说,这个简单的网上商业网站源码涵盖了ASP.NET Web应用...

    Android开发系列视频教程及其实例源码地址

    - **实现过程**:创建自定义的Adapter类,继承`BaseAdapter`或使用更高级的`RecyclerView.Adapter`,然后绑定数据到ListView上。 #### 3.3 音乐播放器(Jamedo) - **技术点**:多媒体播放API的使用,如MediaPlayer。...

    mui第三方登录.zip

    实现第三方登录,通常需要集成微信、QQ、微博等社交平台的SDK,或者使用OAuth2等开放授权协议。MUI本身并不直接支持第三方登录,但可以通过扩展JavaScript和CSS来实现。以下是一般步骤: a. **注册开发者账号**:...

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

     6.3 OAuth2.0网页授权 134  6.3.1 配置网页授权回调域名 135  6.3.2 网页授权流程 135  6.3.3 方法封装 139  6.3.4 案例:通过网页授权获取用户信息 145  6.4 生成带参数二维码 149  6.4.1 创建临时...

    Android购物商城App+客户端+服务端+数据库

    《构建完整的Android购物商城系统:从客户端到服务端详解》 在移动互联网时代,购物商城App已经成为电商领域不可或缺的一部分。Android平台上的购物商城App更是占据了重要地位,它们为用户提供便捷的商品浏览、购买...

    基于springboot+vue的街球社区网站源码数据库论文.doc

    在街球社区网站中,Vue用于构建用户界面,提供数据绑定、指令系统、组件化和路由等功能,提升用户体验。 四、数据库设计 在街球社区网站的数据库设计中,可能包含用户信息表、帖子表、商品表、订单表等多个关键...

Global site tag (gtag.js) - Google Analytics