摘要:需求分析用的架構(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ī)端都很常見(jiàn)。因?yàn)樗兄惶?hào)多用的特點(diǎn),不管是在什么網(wǎng)站什么軟件上只要有了這個(gè)第三方登錄的功能就無(wú)需再次走注冊(cè)步驟,直接用第三方的賬號(hào)登錄就可以了,方便吧?開(kāi)發(fā)程序看重的是用戶(hù)體驗(yàn),為用戶(hù)打造一款“麻雀雖小,五臟俱全”,使用便利的產(chǎn)品是我們的職責(zé)。那么話(huà)又說(shuō)回來(lái),在Restfual api 上如何實(shí)現(xiàn)第三方登錄呢?我在Segmentfault上找不到我想要的答案,不過(guò)最終我也實(shí)現(xiàn)了,我把我的實(shí)現(xiàn)思路寫(xiě)出來(lái),當(dāng)然這只是我的一種實(shí)現(xiàn)方式,要是大家有更好的方法呢,樂(lè)意交流。
需求分析1、用Restfual api的架構(gòu)實(shí)現(xiàn)第三方登錄,如QQ,微信登錄等。
效果圖 實(shí)現(xiàn)思路1、建兩個(gè)表,user表和user_login表。user表我就不詳說(shuō)了,這是基本表,我重點(diǎn)說(shuō)一下user_login表。
user_login表字段:
id id user_id 用戶(hù)id type 登錄類(lèi)型(如:QQ,weixin) qq_access_token QQ授權(quán)access_token qq_openid QQ openid wx_access_token 微信授權(quán)access_token wx_openid 微信openid
要是還有微博或者淘寶之類(lèi)的其他第三方登錄就如以上的規(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(); //判斷是否已存在用戶(hù)信息,存在則返回該條用戶(hù)信息 if(!empty($res)) { $res->qq_access_token = $access_token; $res->save(); //獲取一條用戶(hù)信息 $user = $model->getUserrow($res->user_id); if(!empty($user)){ return $user; }else{ ErrorMsg::Info(Yii::t("yii","Login fail")); } }else{ //保存新用戶(hù) $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(); //判斷是否已存在用戶(hù)信息,存在則返回該條用戶(hù)信息 if(!empty($res)) { $res->wx_access_token = $access_token; $res->save(); //獲取一條用戶(hù)信息 $user = $model->getUserrow($res->user_id); if(!empty($user)){ return $user; }else{ ErrorMsg::Info(Yii::t("yii","Login fail")); } }else{ //保存新用戶(hù) $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")); } }
保存用戶(hù)信息方法:
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")); } }
第三方登錄獲取用戶(hù)基本信息方法,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è)想與問(wèn)題1、直接在user表里加上QQ、weixin的type,openid和access_token字段,這種做法拓展性不好,以后要是再增加如:微博,淘寶等第三方登錄的話(huà),又要操作user表,對(duì)user表操作過(guò)于頻繁容易出問(wèn)題,而且也不是每一個(gè)用戶(hù)都會(huì)使用第三方登錄,會(huì)造成大量空缺字段,浪費(fèi)。我之所以獨(dú)立創(chuàng)建user_login表也正是基于這些考慮的。
2、返回給手機(jī)端所有的用戶(hù)信息。其實(shí)手機(jī)端不需要那些,你只要返回給手機(jī)端access_token和appsercert這兩個(gè)字段就可以了,手機(jī)端會(huì)自己獲取用戶(hù)信息。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79527.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ī)端都很常見(jiàn)。因?yàn)樗兄惶?hào)多用的特點(diǎn),不管是在什么網(wǎng)站什么軟件上只要有了這個(gè)第三方登錄的功能就無(wú)需再次走注冊(cè)步驟,直接用第三方的賬號(hào)登錄就可以了,方便吧?開(kāi)發(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ī)端都很常見(jiàn)。因?yàn)樗兄惶?hào)多用的特點(diǎn),不管是在什么網(wǎng)站什么軟件上只要有了這個(gè)第三方登錄的功能就無(wú)需再次走注冊(cè)步驟,直接用第三方的賬號(hào)登錄就可以了,方便吧?開(kāi)發(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ì)本文有任何的疑問(wèn),請(qǐng)聯(lián)系我:[email protected] 2. Introduc...
閱讀 1041·2023-04-26 02:26
閱讀 2151·2021-09-26 10:16
閱讀 1557·2019-08-30 12:57
閱讀 3471·2019-08-29 16:10
閱讀 3225·2019-08-29 13:47
閱讀 1191·2019-08-29 13:12
閱讀 2143·2019-08-29 11:11
閱讀 1341·2019-08-26 13:28