`

php 与 OAuth2 与 QQ login Testing.

阅读更多
转自: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+oltu.oauth2搭建oauth2环境

    springboot和apache的开源项目org.apache.oltu.oauth2组合搭建的oauth2环境,一般的oauth配置下就可以用了,但是我这个项目,是用原理上讲如何搭建oauth2,哪个controller转发到哪个controller,为什么这样,都有...

    exmaple_google_oauth2_java.zip

    一套完整的 google drive 认证系统,可以根据以下命令编译运行: 将申请的Client ID和Client secrets加入到client_secrets.json cd . (当前源码根路径) mkdir bin ..." com.google.oauth2.Oauth2

    c# Microsoft.Owin.Security.OAuth 验证获取Token用户的信息.txt

    c# WebApi Owin 适用Microsoft.Owin.Security.OAuth Authorize - 特性验证

    spring-security-oauth2-2.3.5.RELEASE-API文档-中文版.zip

    赠送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

    Aspnet-LeXun.Security.OAuth.zip,网络安全,asp.net是一个开源的web框架,用于使用.net构建现代web应用和服务。asp.net创建基于html5、css和javascript的网站,这些网站简单、快速,可以扩展到数百万用户。

    Manning.OAuth.2.in.Action.2017

    无论是在保护用户数据安全,还是在开发需要与其他服务交互的应用时,OAuth 2.0都是一个不可或缺的工具。 最后,从文件的版面信息中,我们可以得知这本书名为《Manning OAuth 2 in Action》,出版于2017年,作者为...

    基于Microsoft.Owin.Security.OAuth实现OAuth 2.0所有应用场景,可集成单点登录功能

    在这个项目中,我们将深入探讨如何使用这个库来实现 OAuth 2.0 的所有应用场景,并且将其与单点登录(Single Sign-On, SSO)功能集成。 **OAuth 2.0 概述** OAuth 2.0 主要用于授权,而非身份验证。它定义了四个...

    OAuth.2.in.Action.pdf

    书中还涵盖了OAuth 2.0与其他相关协议的集成,例如OpenID Connect,它是在OAuth 2.0之上构建的身份验证协议,使得用户可以通过单一登录(SSO)进行身份验证。此外,书中还会介绍如何将OAuth 2.0应用于API访问控制,...

    spring-security-oauth2-2.3.5.RELEASE-API文档-中英对照版.zip

    赠送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依赖信息...

    oauth2.rar

    oauth2oauth2oauth2

    oauth2.zip

    - OAuth2还可以与其他身份验证协议(如OpenID Connect)结合,提供更丰富的用户身份信息。 - 可以根据实际需求定制授权策略,例如添加自定义的权限检查或实现自定义的令牌存储机制。 这个`oauth2.zip`压缩包提供...

    oauth2.md 描述了oauth2基本原理

    描述了oauth2的原理(不含代码,如需demo请联系3546766954@qq.com),简单介绍了oauth2四种验证方式

    spring-security-oauth2.rar

    本篇将深入探讨Spring Security OAuth2如何实现基于密码模式的用户登录以及如何使用数据库和Redis进行Token的存储与管理。 首先,OAuth2是一种授权协议,它允许第三方应用在用户授权的情况下访问受保护的资源。...

    纯java实现的OAuth2流程

    在这个"纯Java实现的OAuth2流程"中,我们将深入探讨如何不依赖Spring Boot来独立构建OAuth2的客户端和服务端。 首先,我们要理解OAuth2的基本流程,它通常包括四个角色:资源所有者(Resource Owner)、资源服务器...

    整合Apache Oltu 与 Shiro. 提供一个轻量的OAUTH2应用框架

    Apache Oltu和Apache Shiro都是在IT领域中广泛使用的开源项目,它们分别专注于身份验证、授权和OAuth2协议的实现。将这两个组件整合在一起,可以构建出一个强大的、轻量级的安全应用框架,适用于各种应用场景,包括...

    AspNet.Security.OAuth.Providers:用于ASP.NET Core的OAuth 2.0社交身份验证提供程序

    AspNet.Security.OAuth.Providers AspNet.Security.OAuth.Providers是安全中间件的集合,您可以在ASP.NET Core应用程序中使用它来支持 , 或类的社交身份验证提供程序。 它直接受到的倡议。 最新的正式版本可以在上...

    前端项目-oauth-io.zip

    3. **安全**:OAuth.IO处理了所有与安全相关的细节,确保用户数据的安全传输。 4. **易于维护**:由于OAuth.IO抽象了OAuth协议的复杂性,当服务提供商更新其API时,开发者只需要关注OAuth.IO的更新,而不需要直接...

    QQ登陆Oauth2示例源码2012610

    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服务器实现.zip

    oauth2-server, 一个 PHP OAuth 2.0服务器实现 PHP OAuth服务器一个 PHP OAuth 2.0服务器实现。 安装包可以以用 Composer 安装,也可以以通过直接修改 composer.json 或者使用 composer require 命令来安装。co

    Laravel开发-oauth2-social-login

    这些是与OAuth2服务交互的关键。 3. **路由设置**:定义用于重定向用户到社交平台授权页面的路由,并在用户授权后接收回调的路由。 4. **授权请求**:用户点击社交登录按钮后,Laravel会重定向用户到指定的社交...

Global site tag (gtag.js) - Google Analytics