>  기사  >  백엔드 개발  >  Sina Weibo 로그인 인터페이스의 CI 프레임워크 개발에 대한 소스 코드 분석

Sina Weibo 로그인 인터페이스의 CI 프레임워크 개발에 대한 소스 코드 분석

不言
不言원래의
2018-06-14 14:58:371887검색

이 글은 주로 CI 프레임워크로 개발된 Sina Weibo 로그인 인터페이스의 소스 코드 분석을 소개합니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다. CI 프레임워크에만 적합합니다. 기능 구현: 로그인 인터페이스가 링크로 성공적으로 점프하고, 사용자 정보(가장 중요한 u_id 포함)를 성공적으로 획득하고, 사용자를 로컬 플랫폼에 연결하고, 사용자가 성공적으로 로그인한 후 정보를 저장하고, 제3자 로그인을 설계합니다. 로컬 데이터베이스의 테이블. 즉, 인터페이스 프로세스가 완료되었습니다. 거의 모든 주요 단계에 대한 메모가 있고 자세히 설명되어 있습니다.

먼저 프로세스를 살펴보겠습니다.

프로세스의 원리:

1. 코드를 통해 access_token을 획득하고 인증을 획득한 후 사용자 정보(사용자 u_id 포함)를 획득합니다. (이 u_id는 타사에서 sina_id라고 합니다.) 나중에 로그인 테이블이 필요함)
2. 사용자 sina_id가 존재하지 않는 경우 두 가지 상황이 있습니다. 사용자가 이미 플랫폼에 계정을 가지고 있습니다. 이 경우 사용자를 플랫폼에 추가해야 합니다(예: 플랫폼의 사용자 테이블: user_reg). ID는 타사 로그인 테이블(예: Third_login 테이블)에 바인딩됩니다. 고객 로그인;
2: 사용자는 플랫폼에 계정이 없으며 등록 페이지로 이동하여 바인딩을 위해 사용자 sina_id를 제3자 로그인 테이블에 씁니다. ) 사용자 sina_id가 존재하는 경우 사용자 테이블(user_reg)을 쿼리합니다. 메일함이 활성화된 경우 직접 로그인하고, 계정을 활성화하려면 사용자에게 이메일 주소로 이동하라는 메시지를 표시합니다.

다음 단계에 대해 자세히 설명합니다.
1단계: 앱 키 및 앱 시크릿 신청 신청 주소: http://open.weibo.com/ 웹 사이트를 클릭하여 WEB에 접속한 후 신청하세요. App Key와 App Secret은 다음과 같습니다.

App Key: 1428003339

App Sercet: f1c6177a38b39f764c76a1690720a6dc
콜백 주소: http://test.com/callback.php

참고: 신청 후 Sina 계정 테스트 계정이 됩니다. 개발 중에 디버깅을 위해 이 계정을 사용할 수 있습니다. 다른 계정은 로그인하고 정보를 반환할 수 없습니다. 개발에 앞서 공식 홈페이지에 접속해 개발 과정을 확인하는 것이 가장 중요하다. 아이디어가 명확한 한 나머지는 코드를 사용하여 원하는 것을 실현하는 것입니다.

2단계: SDK 다운로드, PHP 버전 다운로드, 다운로드 주소(공식 웹사이트): http://code.google.com/p/libweibo/downloads/list, 다운로드된 파일은 5개이며 그 중 하나는 saetv2입니다. .ex.class.php, 이 파일만 필요합니다.

3단계: 코드

1

제3자 로그인 정보를 저장할 제3자 로그인 테이블을 만듭니다(Sina는 u_id이고 QQ는 openid이며 둘 다 고유하며 사용자를 식별하는 데 사용됩니다. 이를 기반으로 저장합니다). ):


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 = '第三方登录表'
설명: 플랫폼은 사용자의 고유 식별자인 u_id를 반환합니다. user_id는 플랫폼 사용자 테이블 user_reg와 연결된 ID입니다. 실제 프로젝트 요구 사항에 따라 테이블을 생성하려면 권장되는 운영 도구는 운영하기 쉬운 phpmyadmin 및 MySQL Workbench입니다. Sina 로그인 인터페이스만 만들어야 하는 경우 qq_id 필드를 제거할 수 있습니다.

2.
구성 파일을 작성하고, 애플리케이션 아래에 새 파일 sina_conf.php를 생성하고, 방금 신청한 앱 키와 앱 비밀을 작성하세요

, 코드는 다음과 같습니다:

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

3.

oauth 인증 방금 다운로드한 saetv2.ex.class.php 파일을 application/libraries에 복사합니다.

참고: 이는 매우 중요한 클래스입니다. 로그인, 인증 및 사용자 정보 획득은 모두 이 클래스의 방법을 사용하므로 애플리케이션/라이브러리에 그대로 적용할 수 없습니다.

4.
시나 웨이보 로그인 클래스(QQ 로그인도 가능하고 여기 QQ 로그인도 함께 패키징되어 있습니다. 시나 로그인 인터페이스만 만들어도 영향은 없습니다)를 작성하고 third_login_model 파일을 생성합니다 application/models.php
에서 코드:

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

Save지침: 이 코드는 항목 파일 callback.php에서 전달되며 자세한 코드는 7단계에 있습니다. 이제 구성 파일, 모델 및 데이터 테이블이 모두 있으므로 다음 단계는 컨트롤러 및 뷰 파일입니다.

5.
로그인 컨트롤러 작성 애플리케이션/컨트롤러에서 login.php 파일을 생성합니다(이름은 직접 선택할 수 있음).
코드:

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

Save6.

파일 레이아웃 보기 Sina Weibo 로그인 버튼, Create index.php 파일

애플리케이션/보기 아래, 코드:

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

Save 참고: 이것은 사진 버튼입니다. 공식 웹사이트에서 사진을 다운로드할 수 있습니다. 다운로드 주소: 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开发实现支付宝接口调用

위 내용은 Sina Weibo 로그인 인터페이스의 CI 프레임워크 개발에 대한 소스 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.