Maison > développement back-end > tutoriel php > Analyse du code source sur le développement du framework CI de l'interface de connexion Sina Weibo

Analyse du code source sur le développement du framework CI de l'interface de connexion Sina Weibo

不言
Libérer: 2023-04-01 08:04:01
original
1943 Les gens l'ont consulté

Cet article présente principalement l'analyse du code source du framework CI pour développer l'interface de connexion Sina Weibo. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

. Remarque : Cet article convient uniquement au framework CI. Implémentation fonctionnelle : l'interface de connexion accède au lien avec succès, obtient les informations utilisateur (y compris le u_id le plus important), connecte l'utilisateur à la plate-forme locale, stocke les informations une fois que l'utilisateur s'est connecté avec succès et conçoit la connexion tierce. table de la base de données locale. Bref, le processus d'interface est terminé. J'ai des notes sur presque toutes les étapes clés et je les explique en détail.

Tout d'abord, jetons un coup d'œil au processus :
Principe du processus :
1. Obtenez le access_token via le code et obtenez l'autorisation, et obtenez les informations de l'utilisateur (y compris l'utilisateur u_id) (ce u_id est dans le formulaire de connexion tiers plus tard) Il s'appelle sina_id, et vous devez créer cette table vous-même)
2. Interrogez la table de connexion tierce Si l'utilisateur sina_id n'existe pas, il existe deux situations. Un : l'utilisateur a déjà un compte sur la plateforme. Dans ce cas, la plateforme (par exemple : La table utilisateur de la plateforme est : user_reg) L'identifiant de l'utilisateur est lié à la table de connexion tierce (par exemple : tablethird_login ), puis le client est autorisé à se connecter ; Au même moment de l'inscription, les informations sont écrites dans la table uer_reg, et l'utilisateur sina_id est également écrit dans la table de connexion tierce pour la liaison
3. Interrogez la table de connexion tierce (third_login). Si l'utilisateur sina_id existe, puis interrogez la table utilisateur (user_reg ), si l'adresse e-mail a été activée, connectez-vous directement. Si elle n'est pas activée, l'utilisateur est invité à y accéder. à l'adresse e-mail pour activer le compte.

Commençons par les étapes détaillées :

Étape 1 : Demandez la clé d'application et le secret de l'application : http://open.weibo.com/ Cliquez sur le site Web pour accéder au WEB, et entrez simplement et postulez. Après avoir réussi, vous obtiendrez la clé d'application et le secret d'application comme suit :
Clé d'application : 1428003339
Sercet d'application : f1c6177a38b39f764c76a1690720a6dc
Adresse de rappel : http://test.com/callback .php

Remarque : après avoir postulé, votre compte Sina sera un compte de test. Vous pouvez utiliser ce compte pour déboguer pendant le développement. Les autres comptes ne peuvent pas se connecter et renvoyer des informations. Avant le développement, il est préférable d'aller sur le site officiel pour vérifier le processus de développement. Le processus est le plus important. Tant que les idées sont claires, le reste consiste à utiliser du code pour réaliser ce que vous pensez.

Étape 2 : Téléchargez le SDK, téléchargez la version php, adresse de téléchargement (site officiel) : http://code.google.com/p/libweibo/downloads/list, il y a 5 fichiers téléchargés, parmi lequel est saetv2.ex.class.php, je n'ai besoin que de ce fichier.

Étape 3 : Code

1
. Créez une table de connexion tierce pour stocker les informations de connexion tierces (Sina est u_id, QQ est openid, ils sont tous deux uniques, utilisés identifie l'utilisateur. , nous le stockons sur cette base) :

CREATE TABLE IF NOT EXISTS `third_login` (
  `user_id` INT(6) NOT NULL,
  `sina_id` BIGINT(16) NULL,
  `qq_id` varchar(64) NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC),
  INDEX `sina_id` (`sina_id` ASC),
  INDEX `index4` (`qq_id` ASC))
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_bin
COMMENT = '第三方登录表'
Copier après la connexion
Explication : La plateforme renvoie u_id, qui est l'identifiant unique de l'utilisateur. Je l'enregistre sous sina_id, user_id est la table utilisateur de la plateforme associée. Je ne listerai pas ici l'identifiant user_reg et la table user_reg. Vous pouvez créer la table en fonction des exigences réelles du projet. Les outils d'exploitation recommandés sont phpmyadmin et MySQL Workbench, qui sont faciles à utiliser.

Si vous avez uniquement besoin de créer l'interface de connexion Sina, vous pouvez supprimer le champ qq_id.

2.

Écrivez le fichier de configuration, créez un nouveau fichier sina_conf.php sous l'application et écrivez la clé d'application et le secret d'application pour lesquels vous venez de postuler , le code est le suivant :

<?php
$config["sina_conf"] = array(
    "App_Key" => &#39;1428003339&#39;,
    "App_Secret" =>&#39;f1c6177a38b39f764c76a1690720a6dc&#39;,
    "WB_CALLBACK_URL" => &#39;http://test.com/callback.php&#39;
);
Copier après la connexion
Enregistrer

3.

Classe d'authentification oauth, copiez le fichier saetv2.ex.class.php que vous venez de télécharger dans l'application/bibliothèques. Remarque : il s'agit d'une classe très importante. La connexion, l'autorisation et l'obtention d'informations sur l'utilisateur utilisent toutes les méthodes de cette classe. Sans cela, vous ne pouvez pas jouer intact sous application/bibliothèques<🎜 >.
4.

Écrivez la classe de connexion Sina Weibo (la connexion QQ est également disponible, et la connexion QQ ici est également regroupée. Même si je ne crée que l'interface de connexion Sina, cela ne l'affectera pas) , dans application/models Téléchargez un fichierthird_login_model.php

, code :

Enregistrer
<?php
/**
 * Description of third_login_model
 *第三方接口授权,登录model
 * @author
 */
class third_login_model extends CI_Model{
    //put your code here
    private $sina=array();
    private $qq  =array();
    private $users =&#39;&#39;;
    private $third=&#39;&#39;;
    public function __construct() {
        parent::__construct();
//        $this->l = DIRECTORY_SEPARATOR;
        $this->load->database();   
        $this->load->library(&#39;session&#39;);
        include_once APPPATH."/libraries"."/saetv2.ex.class.php";
        $this->third =  $this->db->&#39;third_login&#39;;//第三方登录表
        $this->users = $this->db->&#39;user_reg&#39;;//本项目用户表
        $this->config->load("sina_conf");
        $this->sina= $this->config->item("sina_conf");

    }

    /**
      * @uses : 新浪微博登录
      * @param :
      * @return : $sina_url----登录地址
      */
    public function sina_login(){
        $obj = new SaeTOAuthV2($this->sina[&#39;App_Key&#39;],$this->sina[&#39;App_Secret&#39;]);
        $sina_url = $obj->getAuthorizeURL( $this->sina[&#39;WB_CALLBACK_URL&#39;] );
        return $sina_url;
    }

    /**
      * @uses : 登录后,通过返回的code值,获取token,实现授权完成,然后获取用户信息
      * @param : $code
      * @return : $user_message--用户信息
      */
    public function sina_callback($code){
      $obj = new SaeTOAuthV2($this->sina[&#39;App_Key&#39;],$this->sina[&#39;App_Secret&#39;]);
      if (isset($code)) {
      $keys = array();
      $keys[&#39;code&#39;] = $code;
      $keys[&#39;redirect_uri&#39;] = $this->sina[&#39;WB_CALLBACK_URL&#39;];
      try {
        $token = $obj->getAccessToken( &#39;code&#39;, $keys ) ;//完成授权
      } catch (OAuthException $e) {
    }
      }
      $c = new SaeTClientV2($this->sina[&#39;App_Key&#39;], $this->sina[&#39;App_Secret&#39;], $token[&#39;access_token&#39;]);
      $ms =$c->home_timeline();
      $uid_get = $c->get_uid();//获取u_id
      $uid = $uid_get[&#39;uid&#39;];
      $user_message = $c->show_user_by_id($uid);//获取用户信息
      return $user_message;
    }

    /**
      * @uses : 查询第三方登录表
      * @param : $where
      * @return : 第三方登录用户记录结果集
      */
    public function select_third($where) {
        $result = false;
        $this->db->select();
        $this->db->from($this->third);
        $this->db->where($where);
        $query = $this->db->get();
        if($query){
            $result = $query->row_array();
        }
        return $result;
    }

    /*-
      * @uses : sina---查询用户表和第三方登录表
      * @param : $where
      * @return : 第三方登录用户记录结果集
      */
    public function select_user_name($where) {
        $field ="user.id,user.password,user.username,utl.*";
        $sql = "select {$field} from {$this->third} as utl "
                ." left join {$this->users} as user on user.id=utl.user_id"
                . " where utl.sina_id={$where}";
        $query = $this->db->query($sql);
        $result = $query->row_array();
        return $result;
    }

    /**
      * @uses : qq---查询用户表和第三方登录表
      * @param : $where
      * @return : 第三方登录用户记录结果集
      */
    public function select_user_qqname($where) {
        $field ="user.id,user.password,user.username,utl.*";
        $sql = "select {$field} from {$this->third} as utl "
                ." left join {$this->users} as user on user.id=utl.user_id"
                . " where utl.qq_id=&#39;{$where}&#39;";
        $query = $this->db->query($sql);
        $result = $query->row_array();
        return $result;
    }
    
    /**
      * @uses : 将用户和第三方登录表信息绑定
      * @param : $datas
      * @return :
      */
    public function binding_third($datas) {
        if (!is_array($datas)) show_error (&#39;wrong param&#39;);
        if($datas[&#39;sina_id&#39;]==0 && $datas[&#39;qq_id&#39;]==0)  return;

        $resa =&#39;&#39;;
        $resb =&#39;&#39;;
        $resa = $this->select_third(array("user_id"=>$datas[&#39;user_id&#39;]));
        $temp =array(
            "user_id"=>$datas[&#39;user_id&#39;],
            "sina_id"=>$resa[&#39;sina_id&#39;]!=0 ? $resa[&#39;sina_id&#39;] : $datas[&#39;sina_id&#39;],
            "qq_id"  => $resa[&#39;qq_id&#39;]!=0 ? $resa[&#39;qq_id&#39;] : $datas[&#39;qq_id&#39;],
        );
        if($resa){
            $resb = $this->db->update($this->third, $temp,array("user_id"=>$datas[&#39;user_id&#39;]));
        }else{
            $resb = $this->db->insert($this->third,$temp);
        }
        if($resb) {
            $this->session->unset_userdata(&#39;sina_id&#39;);//注销
            $this->session->unset_userdata(&#39;qq_id&#39;);//注销
        }
        return $resb;
    }
}
Copier après la connexion
Remarque : Ce code est passé du fichier d'entrée callback.php, et il y aura son détail code à l'étape 7.

Maintenant que le fichier de configuration, le modèle et la table de données sont tous là, l'étape suivante concerne les fichiers de contrôleur et de visualisation.

5.

Écrire le contrôleur de connexion Sous application/controllers, créez le fichier login.php (vous pouvez choisir le nom vous-même),

Code :

Enregistrer
<?php   if ( ! defined(&#39;BASEPATH&#39;)) exit(&#39;No direct script access allowed&#39;);
/**
 * Description of index
 * @author victory
 */
class Login extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model(&#39;login_model&#39;,&#39;login&#39;);//这个类是本项目的用户登录类,本贴不提供原代码,因为不同的项目,需求不同,可根据你项目需求可以自己封装
        $this->load->model("third_login_model","third");
        $this->load->library(&#39;session&#39;);
    }
    public function index() {
        header("content-type: text/html; charset=utf-8");
        $this->load->model("third_login_model","third");//加载新浪登录接口类
        $datas[&#39;sina_url&#39;] = $this->third->sina_login();//调用类中的sina_login方法
        $this->load->view("index.php",$datas);//调取视图文件,并传入数据
     }
    public function callback(){
        header("content-type: text/html; charset=utf-8");
        $this->load->model("user_reg_model","user_reg");
        $code = $_REQUEST[&#39;code&#39;];//code值由入口文件callback.php传过来
        $arr =array();
        $arr = $this->third->sina_callback($code);//通过授权并获取用户信息(包括u_id)
        $res = $this->third->select_third(array("sina_id"=>$arr[&#39;id&#39;]));
        if(!empty($res)){//用户已有帐号记录,先判断帐号是否激活
            $user_info = $this->user_reg->user_detect(array("id"=>$res[&#39;user_id&#39;]));//查询用户表邮箱状态,user_detect方法就是查询用户信息的方法,上面也说了,login_model.php这个类本贴不提供,需要大家自己去封装。
            if($user_info[&#39;status&#39;]){//根据status的状态判断用户帐号是否激活,user_reg表中的字段status,1为未激活,0为已激活
                echo "<script>alert(&#39;您的账号未激活,请去邮箱激活!&#39;);location=&#39;/login/index&#39;;</script>";die();
            }
            $datas = $this->third->select_user_name($arr[&#39;id&#39;]);//激活后,把信息写入用户表和第三方登录表
            $uname = $datas[&#39;username&#39;];//username,password都是user_reg表的字段,user_reg数据表的构建本帖也不提供,因为每个项目都不一样,需要根据实际项目来
            $password = $datas[&#39;password&#39;];
            $this->load->model("login_model","login");
            $this->login->validation($uname,$password);//validation方法是登录的主要方法,这里主要是在登录的时候,将用户信息写入第三方登录表,下面仅提供写入第三方登录表的代码
            echo "<script>alert(&#39;登录成功!&#39;);location=&#39;/user_center&#39;</script>";die();
        }else{//用户第三方表没有记录,询问用户是否在平台有过帐号,没有跳转注册,有跳转登录
            $this->session->set_userdata(&#39;sina_id&#39;,$arr[&#39;id&#39;]);
            echo "<script>if(!confirm(&#39;是否在平台注册过用户?&#39;)){location=&#39;/register/index&#39;}else{location=&#39;/login&#39;};</script>";
        }     
    }
    public function login_validation(){
      //第三方登录用户id ,sina_id,qq_id的记录增改
        $third_info =array(
            "user_id" => $user_ser[&#39;id&#39;],
            "sina_id" => $this->session->userdata(&#39;sina_id&#39;),
            "qq_id"   =>$this->session->userdata(&#39;qq_id&#39;),
        );
        if($third_info[&#39;sina_id&#39;]||$third_info[&#39;qq_id&#39;])    $this->third->binding_third($third_info);  // 绑定
}

//保存

     //在注册控制器里,用户信息写入user_reg表,同时也把sina_id写入third_login表,我这里只展示第三方登录接口用户id存入数据表的代码
class Register extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->library(&#39;session&#39;);
    }
    public function reg() {
          $haha =array(
                      "user_id" => $rs,
                      "sina_id" => $this->session->userdata(&#39;sina_id&#39;),
                      "qq_id"   =>$this->session->userdata(&#39;qq_id&#39;),
                      );
            if($haha[&#39;sina_id&#39;]||$haha[&#39;qq_id&#39;])    $this->third->binding_third($haha);
    }
}
Copier après la connexion

6.

Afficher la disposition du fichier Bouton de connexion Sina Weibo, créer un fichier index.php

sous application/vue, code :

Enregistrer
<html>
<head>
    <meta content="text/html; charset=utf-8">
    <title>新浪微博登录接口</title>
</head>
<body>
     <p><a href="<?=$sina_url?>"><img src="http://images.cnblogs.com/weibo_login.png" width="110"  /></a></p>
</body>
</html>
Copier après la connexion
Instructions : Ceci est un bouton d'image. Vous pouvez télécharger l'image depuis le site officiel Adresse de téléchargement : http://open.weibo.com/widget/loginbutton.php

7.回调地址
前面在第1步配置文件文件的时候,设置了回调地址:http://test.com/callback.php ,那这个callback.php放在什么地方呢,它需要放在和入口index.php同级的位置,它和application也是同级的。所在在开始的目录下新建文件callback.php。代码:

<?php
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
//新浪微博登录回调入口文件,将路径转移到login/callback方法里,并将code值传过去
$code =&#39;&#39;;
$url = &#39;&#39;;
$str =&#39;&#39;;
$code = $_REQUEST[&#39;code&#39;];
$url  = "/login/callback";
$str = "<!doctype html>
<html>
    <head>
    <meta charset=\"UTF-8\">
    <title>自动跳转</title>
    </head>
<body>";
$str .="<form action=\"{$url}\" method=\"post\" id=\"form\" autocomplete=&#39;off&#39;>";
$str .="<input type=&#39;hidden&#39; name=&#39;code&#39; value=&#39;{$code}&#39;>";
$str .="</form>
        </body>
        </html>
        <script type=\"text/javascript\">
           document.getElementById(&#39;form&#39;).submit();
        </script>";
echo $str;
Copier après la connexion

保存

这个时候,你用浏览器访问index.php文件的时候,会看到一个用微博帐号登录的登录按钮,点击按钮,会跳转到微博登录页面,要你输入新浪微博用户名密码,他会做不同的操作。具体流程我在上面也说过了。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

如何使用CodeIgniter开发实现支付宝接口调用

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal