Sina WeiboログインインターフェースのCIフレームワーク開発に関するソースコード分析
この記事では、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 = '第三方登录表'
説明: プラットフォームはユーザーの一意の識別子である u_id を返します。これを sina_id として保存します。user_id はプラットフォーム ユーザー テーブル user_reg に関連付けられます。ここでは id テーブルと user_reg テーブルをリストしません。実際のプロジェクトの要件に応じてテーブルを構築できます。推奨される操作ツールは、操作が簡単な phpmyadmin と MySQL Workbench です。 Sina ログイン インターフェイスのみを作成する必要がある場合は、qq_id フィールドを削除できます。 2.
設定ファイルを書き込み、アプリケーションの下に新しいファイル 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); } }
Save
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











パソコンを組み立てる際、設置作業は簡単ですが、誤ってCPUラジエーターの電源線をSYS_FANに差し込んでしまうなど、配線に問題が発生することが多く、ファンは回転しますが、ファンが回転しない場合があります。コンピュータの電源がオンになると、F1 エラー「CPUFanError」が発生し、CPU クーラーがインテリジェントに速度を調整できなくなります。コンピューターのマザーボード上の CPU_FAN、SYS_FAN、CHA_FAN、および CPU_OPT インターフェイスに関する一般的な知識を共有しましょう。コンピュータのマザーボード上の CPU_FAN、SYS_FAN、CHA_FAN、および CPU_OPT インターフェイスに関する一般科学 1. CPU_FANCPU_FAN は、CPU ラジエーター専用のインターフェイスであり、12V で動作します。

最新の効率的なプログラミング言語である Go 言語には、開発者が高品質で保守可能なコードを作成するのに役立つ豊富なプログラミング パラダイムと設計パターンがあります。この記事では、Go 言語の一般的なプログラミング パラダイムと設計パターンを紹介し、具体的なコード例を示します。 1. オブジェクト指向プログラミング Go 言語では、構造体とメソッドを使用してオブジェクト指向プログラミングを実装できます。構造を定義し、その構造にメソッドをバインドすることにより、データのカプセル化と動作バインディングのオブジェクト指向機能を実現できます。パッケージマイニ

PHP インターフェースの概要とその定義方法 PHP は、Web 開発で広く使用されているオープンソースのスクリプト言語であり、柔軟性があり、シンプルで強力です。 PHP では、インターフェイスは複数のクラス間で共通のメソッドを定義し、ポリモーフィズムを実現し、コードをより柔軟で再利用可能にするツールです。この記事では、PHP インターフェイスの概念とその定義方法を紹介し、その使用法を示す具体的なコード例を示します。 1. PHP インターフェイスの概念 インターフェイスはオブジェクト指向プログラミングにおいて重要な役割を果たし、クラス アプリケーションを定義します。

エラーの原因は Python にあり、Tornado で NotImplementedError() がスローされるのは、抽象メソッドまたはインターフェイスが実装されていないことが原因である可能性があります。これらのメソッドまたはインターフェイスは親クラスで宣言されますが、子クラスでは実装されません。サブクラスが適切に動作するには、これらのメソッドまたはインターフェイスを実装する必要があります。この問題を解決するには、親クラスで宣言した抽象メソッドやインターフェイスを子クラスに実装します。別のクラスから継承するクラスを使用していてこのエラーが発生した場合は、親クラスで宣言されたすべての抽象メソッドを子クラスに実装する必要があります。インターフェイスを使用していてこのエラーが発生した場合は、インターフェイスで宣言されているすべてのメソッドを、インターフェイスを実装するクラスに実装する必要があります。どちらかわからない場合は、

インターフェイスと抽象クラスは、分離と拡張性のためにデザイン パターンで使用されます。インターフェイスはメソッド シグネチャを定義し、抽象クラスは部分的な実装を提供し、サブクラスは未実装のメソッドを実装する必要があります。ストラテジ パターンでは、インターフェイスを使用してアルゴリズムを定義し、抽象クラスまたは具象クラスが実装を提供するため、アルゴリズムを動的に切り替えることができます。オブザーバー パターンでは、インターフェイスを使用してオブザーバーの動作を定義し、抽象クラスまたは具象クラスを使用して通知をサブスクライブおよびパブリッシュします。アダプター パターンでは、インターフェイスを使用して既存のクラスを適応させることができ、互換性のあるインターフェイスを実装できるため、元のコードとの対話が可能になります。

Huawei が発表した新しいオペレーティング システムとして、Hongmeng システムは業界で大きな波紋を引き起こしました。米国の禁止措置を受けてのファーウェイの新たな試みとして、紅夢システムには大きな期待と期待が寄せられている。最近、幸運にもHongmengシステムを搭載したHuaweiの携帯電話を入手したので、一定期間使用して実際にテストした後、Hongmengシステムの機能テストと使用体験を共有します。まず、Hongmeng システムのインターフェースと機能を見てみましょう。 Honmeng システムは全体的に Huawei 独自のデザインスタイルを採用しており、シンプル、明確、スムーズな操作性を備えています。デスクトップ上には、さまざまな

Java では、インターフェイスおよび抽象クラス内で内部クラスを定義できるため、コードの再利用とモジュール化に柔軟性が提供されます。インターフェイスの内部クラスは特定の関数を実装できますが、抽象クラスの内部クラスは一般的な関数を定義でき、サブクラスは具体的な実装を提供します。

インターフェイス: 実装のないコントラクト インターフェイスは、Java でメソッド シグネチャのセットを定義しますが、具体的な実装は提供しません。これは、インターフェイスを実装するクラスに、その指定されたメソッドを強制的に実装するコントラクトとして機能します。インターフェイス内のメソッドは抽象メソッドであり、メソッド本体はありません。コード例: publicinterfaceAnimal{voideat();voidsleep();} 抽象クラス: 部分的に実装されたブループリント 抽象クラスは、そのサブクラスによって継承できる部分的な実装を提供する親クラスです。インターフェイスとは異なり、抽象クラスには具体的な実装と抽象メソッドを含めることができます。抽象メソッドは、abstract キーワードを使用して宣言され、サブクラスによってオーバーライドされる必要があります。コード例: publicabstractcla
