この記事では、CI フレームワークによって開発された Sina Weibo ログイン インターフェイスのソース コード分析を主に紹介します。これは、必要な友人全員が参照できるようになりました。 #注意: この記事は CI フレームワークにのみ適しています。機能実装: ログイン インターフェイスはリンクに正常にジャンプし、ユーザー情報 (最も重要な u_id を含む) を正常に取得し、ユーザーをローカル プラットフォームに接続し、ユーザーが正常にログインした後に情報を保存し、サードパーティのログインを設計します。ローカルデータベースのテーブル。つまり、インターフェース処理が完了する。ほぼすべての重要なステップについてメモがあり、詳細に説明しています。
最初にプロセスを見てみましょう:
プロセスの原理: 1. コードを通じて access_token を取得し、認可を取得し、ユーザーの情報 (ユーザー u_id を含む) を取得します (この u_id は後ろのサードパーティのログイン フォーム) これは sina_id と呼ばれ、そのテーブルを自分で作成する必要があります)
2. サードパーティのログイン テーブルをクエリします。ユーザー sina_id が存在しない場合は、次の 2 つの状況が考えられます。この場合、ユーザーはプラットフォーム上にすでにアカウントを持っており、プラットフォーム (例: プラットフォームのユーザー テーブルは user_reg です)、ユーザー ID はサードパーティのログイン テーブル (例: third_login テーブル) にバインドされています。その後、顧客はログインを許可されます。登録と同時に、情報が uer_reg テーブルに書き込まれ、ユーザー sina_id もバインドのためにサードパーティのログイン テーブルに書き込まれます。 -party ログイン テーブル ( third_login )。ユーザー sina_id が存在する場合は、ユーザー テーブル ( user_reg ) をクエリします。電子メール アドレスがアクティブ化されている場合は、直接ログインします。アクティブ化されていない場合は、ユーザーは電子メールにアクセスするように求められます。アカウントを有効にするためのアドレス。
詳細な手順から始めましょう:
ステップ 1: アプリ キーとアプリ シークレットを申請します。 アプリケーション アドレス: http://open.weibo.com/ Web サイトをクリックして WEB にアクセスします。合格したら、次のようにアプリ キーとアプリ シークレットを取得します:
App Key: 1428003339
コールバック アドレス: http://test.com/callback .php
注: 申請後、Sina アカウントは開発中のデバッグに使用できます。他のアカウントはログインして情報を返すことができません。開発前に公式サイトで開発プロセスを確認するのが最善です。プロセスが最も重要です。アイデアが明確であれば、あとはコードを使用して必要なものを実現するだけです。
ステップ 2: SDK をダウンロード、php バージョンをダウンロード、ダウンロード アドレス (公式 Web サイト): http://code.google.com/p/libweibo/downloads/list、ダウンロードされたファイルは 5 つあります。これは saetv2.ex.class.php です。必要なのはこのファイルだけです。
ステップ 3: コード
1。サードパーティのログイン情報を保存するためのサードパーティのログイン テーブルを作成します (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 = '第三方登录表'
設定ファイルを書き込み、アプリケーションの下に新しいファイル sina_conf.php を作成し、
に適用したアプリ キーとアプリ シークレットを書き込みます。コードは次のとおりです。
<?php $config["sina_conf"] = array( "App_Key" => '1428003339', "App_Secret" =>'f1c6177a38b39f764c76a1690720a6dc', "WB_CALLBACK_URL" => 'http://test.com/callback.php' );
##3.oauth 認証クラスを保存し、ダウンロードした saetv2.ex.class.php ファイルをアプリケーション/ライブラリにコピーします。
説明: これは非常に重要なクラスです。ログイン、認証、およびユーザー情報の取得はすべてこのクラスのメソッドを使用します。これがなければ、そのままアプリケーション/ライブラリに貼り付けることができません。 4.Sina Weibo ログイン クラスを作成します (QQ ログインも利用可能で、ここでの QQ ログインもパッケージ化されています。Sina ログイン インターフェイスだけを作成しても、影響はありません) application/models ファイル third_login_model.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 ='';
private $third='';
public function __construct() {
parent::__construct();
// $this->l = DIRECTORY_SEPARATOR;
$this->load->database();
$this->load->library('session');
include_once APPPATH."/libraries"."/saetv2.ex.class.php";
$this->third = $this->db->'third_login';//第三方登录表
$this->users = $this->db->'user_reg';//本项目用户表
$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['App_Key'],$this->sina['App_Secret']);
$sina_url = $obj->getAuthorizeURL( $this->sina['WB_CALLBACK_URL'] );
return $sina_url;
}
/**
* @uses : 登录后,通过返回的code值,获取token,实现授权完成,然后获取用户信息
* @param : $code
* @return : $user_message--用户信息
*/
public function sina_callback($code){
$obj = new SaeTOAuthV2($this->sina['App_Key'],$this->sina['App_Secret']);
if (isset($code)) {
$keys = array();
$keys['code'] = $code;
$keys['redirect_uri'] = $this->sina['WB_CALLBACK_URL'];
try {
$token = $obj->getAccessToken( 'code', $keys ) ;//完成授权
} catch (OAuthException $e) {
}
}
$c = new SaeTClientV2($this->sina['App_Key'], $this->sina['App_Secret'], $token['access_token']);
$ms =$c->home_timeline();
$uid_get = $c->get_uid();//获取u_id
$uid = $uid_get['uid'];
$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='{$where}'";
$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 ('wrong param');
if($datas['sina_id']==0 && $datas['qq_id']==0) return;
$resa ='';
$resb ='';
$resa = $this->select_third(array("user_id"=>$datas['user_id']));
$temp =array(
"user_id"=>$datas['user_id'],
"sina_id"=>$resa['sina_id']!=0 ? $resa['sina_id'] : $datas['sina_id'],
"qq_id" => $resa['qq_id']!=0 ? $resa['qq_id'] : $datas['qq_id'],
);
if($resa){
$resb = $this->db->update($this->third, $temp,array("user_id"=>$datas['user_id']));
}else{
$resb = $this->db->insert($this->third,$temp);
}
if($resb) {
$this->session->unset_userdata('sina_id');//注销
$this->session->unset_userdata('qq_id');//注销
}
return $resb;
}
}
構成ファイル、モデル、データ テーブルがすべて揃ったので、次のステップはコントローラー ファイルとビュー ファイルです。 5.
ログイン コントローラーの書き込み application/controllers の下に、login.php ファイルを作成します (名前は自分で選択できます)。Code:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * Description of index * @author victory */ class Login extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model('login_model','login');//这个类是本项目的用户登录类,本贴不提供原代码,因为不同的项目,需求不同,可根据你项目需求可以自己封装 $this->load->model("third_login_model","third"); $this->load->library('session'); } public function index() { header("content-type: text/html; charset=utf-8"); $this->load->model("third_login_model","third");//加载新浪登录接口类 $datas['sina_url'] = $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['code'];//code值由入口文件callback.php传过来 $arr =array(); $arr = $this->third->sina_callback($code);//通过授权并获取用户信息(包括u_id) $res = $this->third->select_third(array("sina_id"=>$arr['id'])); if(!empty($res)){//用户已有帐号记录,先判断帐号是否激活 $user_info = $this->user_reg->user_detect(array("id"=>$res['user_id']));//查询用户表邮箱状态,user_detect方法就是查询用户信息的方法,上面也说了,login_model.php这个类本贴不提供,需要大家自己去封装。 if($user_info['status']){//根据status的状态判断用户帐号是否激活,user_reg表中的字段status,1为未激活,0为已激活 echo "<script>alert('您的账号未激活,请去邮箱激活!');location='/login/index';</script>";die(); } $datas = $this->third->select_user_name($arr['id']);//激活后,把信息写入用户表和第三方登录表 $uname = $datas['username'];//username,password都是user_reg表的字段,user_reg数据表的构建本帖也不提供,因为每个项目都不一样,需要根据实际项目来 $password = $datas['password']; $this->load->model("login_model","login"); $this->login->validation($uname,$password);//validation方法是登录的主要方法,这里主要是在登录的时候,将用户信息写入第三方登录表,下面仅提供写入第三方登录表的代码 echo "<script>alert('登录成功!');location='/user_center'</script>";die(); }else{//用户第三方表没有记录,询问用户是否在平台有过帐号,没有跳转注册,有跳转登录 $this->session->set_userdata('sina_id',$arr['id']); echo "<script>if(!confirm('是否在平台注册过用户?')){location='/register/index'}else{location='/login'};</script>"; } } public function login_validation(){ //第三方登录用户id ,sina_id,qq_id的记录增改 $third_info =array( "user_id" => $user_ser['id'], "sina_id" => $this->session->userdata('sina_id'), "qq_id" =>$this->session->userdata('qq_id'), ); if($third_info['sina_id']||$third_info['qq_id']) $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('session'); } public function reg() { $haha =array( "user_id" => $rs, "sina_id" => $this->session->userdata('sina_id'), "qq_id" =>$this->session->userdata('qq_id'), ); if($haha['sina_id']||$haha['qq_id']) $this->third->binding_third($haha); } }
6.ファイル レイアウトの表示 Sina Weibo ログイン ボタン、index.php ファイル を application/view の下に作成、コード:
<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
説明: これは画像ボタンです。画像は公式 Web サイトからダウンロードできます。ダウンロード アドレス: http://open.weibo.com/widget/loginbutton.php7.回调地址
前面在第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 =''; $url = ''; $str =''; $code = $_REQUEST['code']; $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='off'>"; $str .="<input type='hidden' name='code' value='{$code}'>"; $str .="</form> </body> </html> <script type=\"text/javascript\"> document.getElementById('form').submit(); </script>"; echo $str;
保存
这个时候,你用浏览器访问index.php文件的时候,会看到一个用微博帐号登录的登录按钮,点击按钮,会跳转到微博登录页面,要你输入新浪微博用户名密码,他会做不同的操作。具体流程我在上面也说过了。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上がSina WeiboログインインターフェースのCIフレームワーク開発に関するソースコード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。