转自:http://www.heui.org/archives/454
/**
*
* qq登录
* @author http://www.heui.org
*
*/
class Oauth_qq
{
private static $_instance;
private $config = array();
private function __construct($config)
{
$this->Oauth_qq($config);
}
public static function getInstance($config)
{
if(!isset(self::$_instance))
{
$c=__CLASS__;
self::$_instance = new $c($config);
}
return self::$_instance;
}
private function Oauth_qq($config)
{
$this->config = $config;
$_SESSION["appid"] = $this->config['appid'];
$_SESSION["appkey"] = $this->config['appkey'];
$_SESSION["callback"] = $this->config['callback'];
$_SESSION["scope"] = "get_user_info,add_share,list_album,add_album,upload_pic,add_topic,add_one_blog,add_weibo";
}
function login()
{
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
$login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="
. $_SESSION["appid"] . "&redirect_uri=" . urlencode($_SESSION["callback"])
. "&state=" . $_SESSION['state']
. "&scope=".$_SESSION["scope"];
header("Location:$login_url");
}
function callback()
{
if($_REQUEST['state'] == $_SESSION['state']) //csrf
{
$token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&"
. "client_id=" . $_SESSION["appid"]. "&redirect_uri=" . urlencode($_SESSION["callback"])
. "&client_secret=" . $_SESSION["appkey"]. "&code=" . $_REQUEST["code"];
$response = get_url_contents($token_url);
if (strpos($response, "callback") !== false)
{
$lpos = strpos($response, "(");
$rpos = strrpos($response, ")");
$response = substr($response, $lpos + 1, $rpos - $lpos -1);
$msg = json_decode($response);
if (isset($msg->error))
{
echo "<h3>error:</h3>" . $msg->error;
echo "<h3>msg :</h3>" . $msg->error_description;
exit;
}
}
$params = array();
parse_str($response, $params);
$_SESSION["access_token"] = $params["access_token"];
}
else
{
echo("The state does not match. You may be a victim of CSRF.");
}
}
function get_openid()
{
$graph_url = "https://graph.qq.com/oauth2.0/me?access_token="
. $_SESSION['access_token'];
$str = get_url_contents($graph_url);
if (strpos($str, "callback") !== false)
{
$lpos = strpos($str, "(");
$rpos = strrpos($str, ")");
$str = substr($str, $lpos + 1, $rpos - $lpos -1);
}
$user = json_decode($str);
if (isset($user->error))
{
echo "<h3>error:</h3>" . $user->error;
echo "<h3>msg :</h3>" . $user->error_description;
exit;
}
//set openid to session
return $_SESSION["openid"] = $user->openid;
}
function get_user_info()
{
$get_user_info = "https://graph.qq.com/user/get_user_info?"
. "access_token=" . $_SESSION['access_token']
. "&oauth_consumer_key=" . $_SESSION["appid"]
. "&openid=" . $_SESSION["openid"]
. "&format=json";
$info = get_url_contents($get_user_info);
$arr = json_decode($info, true);
return $arr;
}
public function __clone()
{
trigger_error('Clone is not allow' ,E_USER_ERROR);
}
}
/* 公用函数 */
if (!function_exists("do_post"))
{
function do_post($url, $data)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_URL, $url);
$ret = curl_exec($ch);
curl_close($ch);
return $ret;
}
}
if (!function_exists("get_url_contents"))
{
function get_url_contents($url)
{
if (ini_get("allow_url_fopen") == "1")
return file_get_contents($url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
}
进行实例化测试:
$config['appid'] = '';
$config['appkey'] = '';
$config['callback'] = '';
$o_qq = Oauth_qq::getInstance($config);
//then
$o_qq->login();
//or
$o_qq->callback();
$o_qq->get_openid();
$o_qq->get_user_info();
分享到:
相关推荐
springboot和apache的开源项目org.apache.oltu.oauth2组合搭建的oauth2环境,一般的oauth配置下就可以用了,但是我这个项目,是用原理上讲如何搭建oauth2,哪个controller转发到哪个controller,为什么这样,都有...
一套完整的 google drive 认证系统,可以根据以下命令编译运行: 将申请的Client ID和Client secrets加入到client_secrets.json cd . (当前源码根路径) mkdir bin ..." com.google.oauth2.Oauth2
c# WebApi Owin 适用Microsoft.Owin.Security.OAuth Authorize - 特性验证
赠送jar包:spring-security-oauth2-2.3.5.RELEASE.jar; 赠送原API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc.jar; 赠送源代码:spring-security-oauth2-2.3.5.RELEASE-sources.jar; 赠送Maven依赖信息...
Aspnet-LeXun.Security.OAuth.zip,网络安全,asp.net是一个开源的web框架,用于使用.net构建现代web应用和服务。asp.net创建基于html5、css和javascript的网站,这些网站简单、快速,可以扩展到数百万用户。
无论是在保护用户数据安全,还是在开发需要与其他服务交互的应用时,OAuth 2.0都是一个不可或缺的工具。 最后,从文件的版面信息中,我们可以得知这本书名为《Manning OAuth 2 in Action》,出版于2017年,作者为...
在这个项目中,我们将深入探讨如何使用这个库来实现 OAuth 2.0 的所有应用场景,并且将其与单点登录(Single Sign-On, SSO)功能集成。 **OAuth 2.0 概述** OAuth 2.0 主要用于授权,而非身份验证。它定义了四个...
书中还涵盖了OAuth 2.0与其他相关协议的集成,例如OpenID Connect,它是在OAuth 2.0之上构建的身份验证协议,使得用户可以通过单一登录(SSO)进行身份验证。此外,书中还会介绍如何将OAuth 2.0应用于API访问控制,...
赠送jar包:spring-security-oauth2-2.3.5.RELEASE.jar; 赠送原API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc.jar; 赠送源代码:spring-security-oauth2-2.3.5.RELEASE-sources.jar; 赠送Maven依赖信息...
oauth2oauth2oauth2
- OAuth2还可以与其他身份验证协议(如OpenID Connect)结合,提供更丰富的用户身份信息。 - 可以根据实际需求定制授权策略,例如添加自定义的权限检查或实现自定义的令牌存储机制。 这个`oauth2.zip`压缩包提供...
描述了oauth2的原理(不含代码,如需demo请联系3546766954@qq.com),简单介绍了oauth2四种验证方式
本篇将深入探讨Spring Security OAuth2如何实现基于密码模式的用户登录以及如何使用数据库和Redis进行Token的存储与管理。 首先,OAuth2是一种授权协议,它允许第三方应用在用户授权的情况下访问受保护的资源。...
在这个"纯Java实现的OAuth2流程"中,我们将深入探讨如何不依赖Spring Boot来独立构建OAuth2的客户端和服务端。 首先,我们要理解OAuth2的基本流程,它通常包括四个角色:资源所有者(Resource Owner)、资源服务器...
Apache Oltu和Apache Shiro都是在IT领域中广泛使用的开源项目,它们分别专注于身份验证、授权和OAuth2协议的实现。将这两个组件整合在一起,可以构建出一个强大的、轻量级的安全应用框架,适用于各种应用场景,包括...
AspNet.Security.OAuth.Providers AspNet.Security.OAuth.Providers是安全中间件的集合,您可以在ASP.NET Core应用程序中使用它来支持 , 或类的社交身份验证提供程序。 它直接受到的倡议。 最新的正式版本可以在上...
3. **安全**:OAuth.IO处理了所有与安全相关的细节,确保用户数据的安全传输。 4. **易于维护**:由于OAuth.IO抽象了OAuth协议的复杂性,当服务提供商更新其API时,开发者只需要关注OAuth.IO的更新,而不需要直接...
QQ登陆Oauth2示例源码 项目描述 配置步骤: 1、设置web.config 的 app_ID 和 app_Key 申请地址:http://connect.qq.com/intro/login 2、本地调试,请设置host文件,打开C:\Windows\System32\drivers\etc,添加...
oauth2-server, 一个 PHP OAuth 2.0服务器实现 PHP OAuth服务器一个 PHP OAuth 2.0服务器实现。 安装包可以以用 Composer 安装,也可以以通过直接修改 composer.json 或者使用 composer require 命令来安装。co
这些是与OAuth2服务交互的关键。 3. **路由设置**:定义用于重定向用户到社交平台授权页面的路由,并在用户授权后接收回调的路由。 4. **授权请求**:用户点击社交登录按钮后,Laravel会重定向用户到指定的社交...