摘要:需求分析用的架構(gòu)實(shí)現(xiàn)第三方登錄,如,微信登錄等。好了,到這里架構(gòu)的第三方登錄已經(jīng)實(shí)現(xiàn)了微博,淘寶等第三方登錄實(shí)現(xiàn)的思路也如此,就是要對(duì)傳入的參數(shù)進(jìn)行改進(jìn)一下就了。
序言
第三方登錄的使用在當(dāng)今非常普遍,不管是PC端還是手機(jī)端都很常見。因?yàn)樗兄惶?hào)多用的特點(diǎn),不管是在什么網(wǎng)站什么軟件上只要有了這個(gè)第三方登錄的功能就無需再次走注冊(cè)步驟,直接用第三方的賬號(hào)登錄就可以了,方便吧?開發(fā)程序看重的是用戶體驗(yàn),為用戶打造一款“麻雀雖小,五臟俱全”,使用便利的產(chǎn)品是我們的職責(zé)。那么話又說回來,在Restfual api 上如何實(shí)現(xiàn)第三方登錄呢?我在Segmentfault上找不到我想要的答案,不過最終我也實(shí)現(xiàn)了,我把我的實(shí)現(xiàn)思路寫出來,當(dāng)然這只是我的一種實(shí)現(xiàn)方式,要是大家有更好的方法呢,樂意交流。
需求分析1、用Restfual api的架構(gòu)實(shí)現(xiàn)第三方登錄,如QQ,微信登錄等。
效果圖 實(shí)現(xiàn)思路1、建兩個(gè)表,user表和user_login表。user表我就不詳說了,這是基本表,我重點(diǎn)說一下user_login表。
user_login表字段:
id id user_id 用戶id type 登錄類型(如:QQ,weixin) qq_access_token QQ授權(quán)access_token qq_openid QQ openid wx_access_token 微信授權(quán)access_token wx_openid 微信openid
要是還有微博或者淘寶之類的其他第三方登錄就如以上的規(guī)律加上對(duì)應(yīng)的字段就行了。
2、gii生成UserLogin.php model如下:
30], [["qq_access_token", "wx_access_token"], "string", "max" => 220], [["qq_openid", "wx_openid"], "string", "max" => 100] ]; } /** * @inheritdoc */ public function attributeLabels() { return [ "id" => Yii::t("yii", "ID"), "user_id" => Yii::t("yii", "User ID"), "type" => Yii::t("yii", "Type"), "qq_access_token" => Yii::t("yii", "Qq Access Token"), "qq_openid" => Yii::t("yii", "Qq Openid"), "wx_access_token" => Yii::t("yii", "Wx Access Token"), "wx_openid" => Yii::t("yii", "Wx Openid"), ]; } }
3、控制器里的方法如下:
QQ登錄
public function actionQqLogin() { $_model = new UserLogin(); $model = new TUser(); $post = Yii::$app->request->post(); if(!empty($post)) { $t_nickname = !empty($post["t_nickname"]) ? trim($post["t_nickname"]) : ""; $access_token = !empty($post["access_token"]) ? trim($post["access_token"]) : ""; $openid = !empty($post["openid"]) ? trim($post["openid"]) : ""; $t_photo = !empty($post["t_photo"]) ? trim($post["t_photo"]) : "";//頭像 $res = UserLogin::find() ->where(["type"=>"qq","qq_openid"=>$openid]) ->one(); //判斷是否已存在用戶信息,存在則返回該條用戶信息 if(!empty($res)) { $res->qq_access_token = $access_token; $res->save(); //獲取一條用戶信息 $user = $model->getUserrow($res->user_id); if(!empty($user)){ return $user; }else{ ErrorMsg::Info(Yii::t("yii","Login fail")); } }else{ //保存新用戶 $user = $this->saveUser($t_nickname,$t_nickname,$openid,"","",$t_photo); if(empty($return["error_code"])){ $_model->user_id = $user->t_id; $_model->type = "qq"; $_model->qq_access_token = $access_token; $_model->qq_openid = $openid; $_model->save(); $user = $model->getUserrow($user->t_id); //保證返回?cái)?shù)據(jù)字段一致 } return $user; } }else{ ErrorMsg::Info(Yii::t("yii","Login fail")); } }
微信登錄
public function actionWxLogin() { $_model = new UserLogin(); $model = new TUser(); $post = Yii::$app->request->post(); if(!empty($post)) { $t_nickname = !empty($post["t_nickname"]) ? trim($post["t_nickname"]) : ""; $access_token = !empty($post["access_token"]) ? trim($post["access_token"]) : ""; $openid = !empty($post["openid"]) ? trim($post["openid"]) : ""; $t_photo = !empty($post["t_photo"]) ? trim($post["t_photo"]) : "";//頭像 $res = UserLogin::find() ->where(["type"=>"weixin","wx_openid"=>$openid]) ->one(); //判斷是否已存在用戶信息,存在則返回該條用戶信息 if(!empty($res)) { $res->wx_access_token = $access_token; $res->save(); //獲取一條用戶信息 $user = $model->getUserrow($res->user_id); if(!empty($user)){ return $user; }else{ ErrorMsg::Info(Yii::t("yii","Login fail")); } }else{ //保存新用戶 $user = $this->saveUser($t_nickname,$t_nickname,$openid,"","",$t_photo); if(empty($return["error_code"])){ $_model->user_id = $user->t_id; $_model->type = "weixin"; $_model->wx_access_token = $access_token; $_model->wx_openid = $openid; $_model->save(); $user = $model->getUserrow($user->t_id);//保證返回?cái)?shù)據(jù)字段一致 } return $user; } }else{ ErrorMsg::Info(Yii::t("yii","Login fail")); } }
保存用戶信息方法:
public function saveUser($t_username,$t_nickname,$openid,$email,$phone,$t_photo) { $access_token = sha1(time().$openid); $data = array( "t_nickname"=> $t_nickname, "t_password"=> base64_encode($openid), "t_state" => 0, "t_photo" => $t_photo?$t_photo:"/images/upload/100x100/no_photo.jpg", "t_timezone"=> "PRC", "t_language"=> "zh_cn", "access_token"=> $access_token, "rent_user_type"=>"3", "t_add_time"=>time(), ); $model = new $this->modelUser; $model->attributes = $data; if(!empty($t_nickname) && !empty($openid)){ if(!$model->save()){ ErrorMsg::Info(Yii::t("yii","Reg fail")); } return $model; }else{ ErrorMsg::Info(Yii::t("yii","m-log-2")); } }
第三方登錄獲取用戶基本信息方法,TUser model里:
public function getUserrow($uid) { $user = $this->find() ->select(["access_token","t_password"]) ->where(["t_id"=>$uid]) ->one(); if(!empty($user)){ $result["access_token"]= !empty($access_token=$user->access_token)?$access_token:""; $result["appsercert"] = !empty($t_password=$user->t_password)?$t_password:""; return $result; //返回給手機(jī)端用,只返回access_token和appsercert。 } }
好了,到這里Restfual api 架構(gòu)的第三方登錄已經(jīng)實(shí)現(xiàn)了,微博,淘寶等第三方登錄實(shí)現(xiàn)的思路也如此,就是要對(duì)傳入的參數(shù)進(jìn)行改進(jìn)一下就OK了。這是我實(shí)現(xiàn)Restfual api架構(gòu)的第三方登錄的思路,不足的提議,好的點(diǎn)贊哈,我們一起交流。
設(shè)想與問題1、直接在user表里加上QQ、weixin的type,openid和access_token字段,這種做法拓展性不好,以后要是再增加如:微博,淘寶等第三方登錄的話,又要操作user表,對(duì)user表操作過于頻繁容易出問題,而且也不是每一個(gè)用戶都會(huì)使用第三方登錄,會(huì)造成大量空缺字段,浪費(fèi)。我之所以獨(dú)立創(chuàng)建user_login表也正是基于這些考慮的。
2、返回給手機(jī)端所有的用戶信息。其實(shí)手機(jī)端不需要那些,你只要返回給手機(jī)端access_token和appsercert這兩個(gè)字段就可以了,手機(jī)端會(huì)自己獲取用戶信息。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65966.html
摘要:需求分析用的架構(gòu)實(shí)現(xiàn)第三方登錄,如,微信登錄等。好了,到這里架構(gòu)的第三方登錄已經(jīng)實(shí)現(xiàn)了微博,淘寶等第三方登錄實(shí)現(xiàn)的思路也如此,就是要對(duì)傳入的參數(shù)進(jìn)行改進(jìn)一下就了。 序言 第三方登錄的使用在當(dāng)今非常普遍,不管是PC端還是手機(jī)端都很常見。因?yàn)樗兄惶?hào)多用的特點(diǎn),不管是在什么網(wǎng)站什么軟件上只要有了這個(gè)第三方登錄的功能就無需再次走注冊(cè)步驟,直接用第三方的賬號(hào)登錄就可以了,方便吧?開發(fā)程序看重...
摘要:需求分析用的架構(gòu)實(shí)現(xiàn)第三方登錄,如,微信登錄等。好了,到這里架構(gòu)的第三方登錄已經(jīng)實(shí)現(xiàn)了微博,淘寶等第三方登錄實(shí)現(xiàn)的思路也如此,就是要對(duì)傳入的參數(shù)進(jìn)行改進(jìn)一下就了。 序言 第三方登錄的使用在當(dāng)今非常普遍,不管是PC端還是手機(jī)端都很常見。因?yàn)樗兄惶?hào)多用的特點(diǎn),不管是在什么網(wǎng)站什么軟件上只要有了這個(gè)第三方登錄的功能就無需再次走注冊(cè)步驟,直接用第三方的賬號(hào)登錄就可以了,方便吧?開發(fā)程序看重...
摘要:每個(gè)服務(wù)運(yùn)行在其獨(dú)立的進(jìn)程中,服務(wù)與服務(wù)間采用輕量級(jí)的通信機(jī)制互相溝通通常是基于的。在微服務(wù)架構(gòu)下,故障會(huì)被隔離在單個(gè)服務(wù)中。 1. 源碼下載地址 源碼鏈接: https://github.com/samt007/xy... 這是用Spring Cloud微服務(wù)架構(gòu)搭建的一套基于EBS的API服務(wù)系統(tǒng)如對(duì)本文有任何的疑問,請(qǐng)聯(lián)系我:samt007@qq.com 2. Introduc...
閱讀 939·2021-11-22 12:09
閱讀 3710·2021-09-27 13:36
閱讀 1396·2021-08-20 09:37
閱讀 4016·2019-12-27 12:22
閱讀 2360·2019-08-30 15:55
閱讀 2364·2019-08-30 13:16
閱讀 2822·2019-08-26 17:06
閱讀 3440·2019-08-23 18:32