ホームページ >バックエンド開発 >PHPチュートリアル >CI フレームワーク開発 Sina Weibo ログイン インターフェイス完全版ソース コード_PHP チュートリアル

CI フレームワーク開発 Sina Weibo ログイン インターフェイス完全版ソース コード_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:29:151239ブラウズ

まず、プロセスを見てみましょう:
プロセスの原理:
1. コードを通じて access_token を取得し、認可を取得し、ユーザーの情報 (ユーザー u_id を含む) を取得します (この u_id は、サードパーティでは sina_id と呼ばれます) 2. サードパーティのログイン テーブルにクエリを実行します。ユーザー sina_id が存在しない場合は、2 つの状況が考えられます。1 つは、ユーザーがプラットフォーム上にすでにアカウントを持っていることです。この場合、プラットフォームのユーザー ID (例: プラットフォームのユーザー テーブルは user_reg) をサードパーティのログイン テーブル (Third_login テーブルなど) にバインドして、顧客がログインできるようにする必要があります。 : ユーザーはプラットフォームにアカウントを持っていないため、登録ページにジャンプして、バインドするためにサードパーティのログイン テーブルに書き込まれます。
3. ユーザーの場合は、サードパーティのログイン テーブルをクエリします。 sina_id が存在する場合は、ユーザー テーブル (user_reg) をクエリします。メールボックスがアクティブ化されていない場合は、ユーザーは自分の電子メールにアクセスしてアカウントをアクティブ化するように求められます。

以下の手順を詳しく説明します:

ステップ1: アプリキーとアプリシークレットを申請します 申請アドレス: http://open.weibo.com/ ページ上のウェブサイトをクリックしてWEBにアクセスし、そのまま申請してください合格すると、次のアプリ キーとアプリ シークレットを取得します:

App Key: 1428003339
App Sercet: f1c6177a38b39f764c76a1690720a6dc
コールバック アドレス: http://test.com/callback.php

注意: 申請後、Sina アカウントは開発中のデバッグに使用できます。他のアカウントはログインして情報を返すことができません。開発前に公式サイトで開発プロセスを確認するのが一番重要です。アイデアが明確であれば、あとはコードを使用して必要なものを実現するだけです。

ステップ 2: SDK をダウンロード、php バージョンをダウンロード、ダウンロード アドレス (公式 Web サイト): http://code.google.com/p/libweibo/downloads/list、ダウンロードされたファイルは 5 つあり、そのうちの 1 つは 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
デフォルト文字セット = utf8
COLLATE = utf8_bin
COMMENT = 'サードパーティログインフォーム'


注: プラットフォームはユーザーの一意の識別子である u_id を返します。 user_id はプラットフォーム ユーザー テーブル user_reg に関連付けられている ID です。ここでは user_reg テーブルを作成できません。実際のプロジェクト要件を表に示します。推奨される操作ツールには、操作が簡単な phpmyadmin と MySQL Workbench が含まれます。 Sina ログイン インターフェイスを作成するだけの場合は、qq_id フィールドを削除できます。


2.

設定ファイルを書き込み、アプリケーションの下に新しいファイルsina_conf.phpを作成し、申請したアプリキーとアプリシークレットを書き込みます

コードは次のとおりです。

コードをコピーします

コードは次のとおりです:$config["sina_conf"] = array(
"App_Key" => '1428003339',
"App_Secret" => ;'f1c6177a 38b39f764c76a1690720a6dc' ,
"WB_CALLBACK_URL" => 'http://test.com/callback.php'
);



保存
3.

oauth 認証クラス、ダウンロードした saetv2.ex.class.php ファイルをアプリケーション/ライブラリにコピーします。

注: これは非常に重要なクラスです。ログイン、認証、およびユーザー情報の取得はすべてこのクラスのメソッドを使用します。これがないと、アプリケーション/ライブラリにそのまま貼り付けることができません。

4.
Sina Weibo ログイン クラスを作成し (QQ ログインも利用可能です。私の QQ ログインもここにパッケージ化されています。Sina ログイン インターフェイスだけを作成しても影響はありません)、application/ の下にファイル third_login_model.php を作成します。モデル
、コード:

コードをコピーします

コードは次のとおりです:

/**
* third_login_model の説明
*サードパーティインターフェイスの認証、ログインモデル
* @author
*/
class third_login_model extends CI_Model{
//ここにコードを入れてください
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: Sina Weibo ログイン
* @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: ログイン後、返されたコード値からトークンを取得し、認証を完了して、ユーザー情報を取得します
* @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;
}

/**
*/
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 : 第三方登录用户记录结果集
*/
パブリック関数 select_user_name($ここで) {
$field ="user.id,user.password,user.username,utl.*";
$sql = "{$this->third} から {$field} を utl "
." として選択します。左は user.id=utl.user_id"
のユーザーとして {$this->users} に参加します。 " where utl.sina_id={$where}";
$query = $this->db->query($sql);
$result = $query->row_array();
return $result;
}

/**
*/
public function select_user_qqname($where) {
$field ="user.id,user.password,user.username,utl.*";
$sql = "select {$ field} から {$this->third} を utl "
." として、{$this->users} を user.id=utl.user_id"
に参加します。 " where utl.qq_id='{$where}'";
$query = $this->db->query($sql);
$result = $query->row_array();
return $result ;
}


/***/

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-& gt;unset_userdata ('sina_id');//注销
$this->session->unset_userdata('qq_id');//注销
}
return $resb;
}
}



保存
説明: このコードはエントリ ファイルcallback.php によって転送され、7 番目のステップには詳細なコードが含まれています。 。

5.

写登录制御器 application/controllers下,建立login.php文件(名字你可以自己取),代码:



复制代価代価如下:


/**
* 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 の追加と変更を記録します
" "user_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 は CI_Controller を拡張します {

パブリック関数 __construct() {

__construct(); "user_id " => $rs,

"sina_id" => $this->session->userdata('sina_id'),
"qq_id " => ;$this->session-> ;userdata('qq_id '),

);
保存

6.
ファイルレイアウトを表示するSina Weiboログインボタン、アプリケーション/ビューの下にindex.phpファイルを作成、コード:




コードをコピーします

コードは次のとおりです:

保存
注: これは画像ボタンです。ダウンロードアドレス: http://open.weibo.com/widget/loginbutton.php

7.
コールバック アドレス

ステップ 1 でファイルを設定するとき、コールバック アドレスを設定します: http://test.com/callback.php では、この callback.php はどこに配置する必要がありますか?エントリindex.phpと同じレベルであり、アプリケーションとも同じレベルです。開始ディレクトリに新しいファイル callback.php を作成します。コード:



コードをコピーします

コードは次のとおりです:


/*
* このライセンス ヘッダーを変更するには、プロジェクト プロパティで [ライセンス ヘッダー] を選択します。
* このテンプレート ファイルを変更するには、[ツール] テンプレートを選択します
* エディタでテンプレートを開きます。
*/
//Sina Weibo ログイン コールバックエントリファイルを作成し、ログイン/コールバックメソッドにパスを転送し、コード値
$code ='';
$url = '';
$str ='';
$code = $_REQUEST['code '] ;
$url = "/ログイン/コールバック";

$str = "

"
"
" 自動ジャンプ
" < /head>
";
$str .="

";
$ str .="";
$str .="



保存

この時点で、ブラウザを使用してindex.phpファイルにアクセスすると、Weiboアカウントでログインするためのログインボタンが表示されます。ボタンをクリックすると、Weiboログインページにジャンプし、アカウントの入力を求められます。 Sina Weibo のユーザー名とパスワード、彼は別の操作を実行します。具体的なプロセスについても上で述べました。

http://www.bkjia.com/PHPjc/777637.html

www.bkjia.com

本当

http://www.bkjia.com/PHPjc/777637.html技術記事まず、プロセスを見てみましょう。 プロセスの原則: 1. コードを通じて access_token を取得し、認可を取得し、ユーザーの情報 (ユーザー u_id を含む) を取得します (この u_id は、後でサードパーティのログイン テーブルで呼び出されます)。 ..
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。