Heim  >  Artikel  >  Backend-Entwicklung  >  Quellcode-Analyse zur CI-Framework-Entwicklung der Sina Weibo-Anmeldeschnittstelle

Quellcode-Analyse zur CI-Framework-Entwicklung der Sina Weibo-Anmeldeschnittstelle

不言
不言Original
2018-06-14 14:58:371841Durchsuche

Dieser Artikel stellt hauptsächlich die Quellcode-Analyse des CI-Frameworks zur Entwicklung der Sina Weibo-Anmeldeschnittstelle vor. Jetzt kann ich ihn mit Ihnen teilen

Hinweis: Dieser Artikel ist nur für CI-Framework geeignet. Funktionale Implementierung: Die Anmeldeschnittstelle springt erfolgreich zum Link, ruft die Benutzerinformationen (einschließlich der wichtigsten u_id) erfolgreich ab, verbindet den Benutzer mit der lokalen Plattform, speichert die Informationen, nachdem sich der Benutzer erfolgreich angemeldet hat, und entwirft die Anmeldung eines Drittanbieters Tabelle der lokalen Datenbank. Kurz gesagt, der Schnittstellenprozess ist abgeschlossen. Ich habe zu fast jedem wichtigen Schritt Notizen und erkläre ihn ausführlich.

Werfen wir zunächst einen Blick auf den Prozess:
Prinzip des Prozesses:
1. Erhalten Sie das access_token über den Code, erhalten Sie eine Autorisierung und erhalten Sie die Benutzerinformationen (einschließlich Benutzer-u_id) (dies u_id steht später im Drittanbieter-Anmeldeformular. Sie heißt sina_id. Sie müssen diese Tabelle selbst erstellen.
2. Fragen Sie die Drittanbieter-Anmeldetabelle ab. Wenn der Benutzer sina_id nicht vorhanden ist, gibt es zwei Situationen : Der Benutzer hat bereits ein Konto auf der Plattform. In diesem Fall ist die Plattform (z. B.: Die Benutzertabelle der Plattform ist: user_reg). Die Benutzer-ID ist an die Anmeldetabelle eines Drittanbieters gebunden (z. B.: Third_login-Tabelle). , und dann darf sich der Kunde anmelden; Gleichzeitig mit der Registrierung werden die Informationen in die Tabelle uer_reg geschrieben, und der Benutzer sina_id wird zur Bindung auch in die Drittanbieter-Anmeldetabelle geschrieben Wenn der Benutzer sina_id vorhanden ist, fragen Sie die Benutzertabelle (user_reg) ab. Wenn die E-Mail-Adresse aktiviert wurde, melden Sie sich direkt an. Wenn sie nicht aktiviert ist, wird der Benutzer aufgefordert, zu gehen die E-Mail-Adresse zur Aktivierung des Kontos.

Beginnen wir mit den detaillierten Schritten:

Schritt 1: App-Schlüssel und App-Geheimnis beantragen. Anwendungsadresse: http://open.weibo.com/ Klicken Sie auf die Website, um auf das WEB zuzugreifen Gehen Sie einfach hinein und bewerben Sie sich. Nach dem Bestehen erhalten Sie den App-Schlüssel und das App-Geheimnis wie folgt:

App-Schlüssel: 1428003339
App-Sercet: f1c6177a38b39f764c76a1690720a6dc
Rückrufadresse: http://test.com/callback .php

Hinweis: Nach der Bewerbung ist Ihr Sina-Konto ein Testkonto. Sie können dieses Konto zum Debuggen während der Entwicklung verwenden. Andere Konten können sich nicht anmelden und keine Informationen zurückgeben. Vor der Entwicklung ist es am besten, die offizielle Website zu besuchen, um den Entwicklungsprozess zu überprüfen. Solange die Ideen klar sind, besteht der Rest darin, mithilfe von Code zu realisieren, was Sie wollen.

Schritt 2: Laden Sie das SDK herunter, laden Sie die PHP-Version herunter, Download-Adresse (offizielle Website): http://code.google.com/p/libweibo/downloads/list, es werden 5 Dateien heruntergeladen, darunter Welches ist saetv2.ex.class.php, ich brauche nur diese Datei.

Schritt 3: Code

1

Erstellen Sie eine Drittanbieter-Anmeldetabelle, um Anmeldeinformationen von Drittanbietern zu speichern (Sina ist u_id, QQ ist openid, beide sind eindeutig und werden zur Identifizierung des Benutzers verwendet , wir speichern es auf dieser Grundlage):

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 = '第三方登录表'
Erläuterung: Die Plattform gibt u_id zurück, die eindeutige Kennung des Benutzers. Ich speichere sie als sina_id, user_id ist mit der Plattformbenutzertabelle user_reg verknüpft Ich werde die Tabellen id und user_reg hier nicht auflisten. Sie können die Tabellen entsprechend den tatsächlichen Projektanforderungen erstellen. Die empfohlenen Betriebstools sind phpmyadmin und MySQL Workbench, die einfach zu bedienen sind.

Wenn Sie nur die Sina-Anmeldeschnittstelle erstellen müssen, können Sie das Feld qq_id entfernen.


2.

Schreiben Sie die Konfigurationsdatei, erstellen Sie unter Anwendung eine neue Datei sina_conf.php und schreiben Sie den App Key und das App Secret, die Sie gerade beantragt haben

, der Code lautet wie folgt:

<?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;
);
Speichern

3.

oauth-Authentifizierungsklasse, kopieren Sie die Datei saetv2.ex.class.php, die Sie gerade heruntergeladen haben, in die Anwendung/Bibliotheken.

Hinweis: Dies ist eine sehr wichtige Klasse. Ohne sie können Sie sie nicht unter Anwendung/Bibliotheken abspielen.
4.
Schreiben Sie die Sina Weibo-Anmeldeklasse (QQ-Anmeldung ist ebenfalls verfügbar, und die QQ-Anmeldung hier ist ebenfalls gepackt. Selbst wenn ich nur die Sina-Anmeldeschnittstelle erstelle, hat dies keine Auswirkungen.) , in application/models Erstellen Sie eine Dateithird_login_model.php

, Code:

<?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;
    }
}
Speichern Beschreibung: Dieser Code wird aus der Eintragsdatei callback.php übergeben, und sein detaillierter Code wird in Schritt sein 7.

Da nun die Konfigurationsdatei, das Modell und die Datentabelle vorhanden sind, sind der nächste Schritt die Controller- und Ansichtsdateien.


5.
Login-Controller schreiben Unter Anwendung/Controller erstellen Sie die Datei login.php (Sie können den Namen selbst wählen),

Code:

<?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);
    }
}
Speichern

6.

Dateilayout anzeigen Sina Weibo-Anmeldeschaltfläche, index.php-Datei erstellen

unter Anwendung/Ansicht, Code:

<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>
SpeichernHinweis: Dies ist eine Bildschaltfläche. Sie können das Bild von der offiziellen Website herunterladen, Download-Adresse: 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;

保存

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

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

相关推荐:

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

Das obige ist der detaillierte Inhalt vonQuellcode-Analyse zur CI-Framework-Entwicklung der Sina Weibo-Anmeldeschnittstelle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn