摘要:需求分析用的架構實現第三方登錄,如,微信登錄等。好了,到這里架構的第三方登錄已經實現了微博,淘寶等第三方登錄實現的思路也如此,就是要對傳入的參數進行改進一下就了。
序言
第三方登錄的使用在當今非常普遍,不管是PC端還是手機端都很常見。因為它有著一號多用的特點,不管是在什么網站什么軟件上只要有了這個第三方登錄的功能就無需再次走注冊步驟,直接用第三方的賬號登錄就可以了,方便吧?開發程序看重的是用戶體驗,為用戶打造一款“麻雀雖小,五臟俱全”,使用便利的產品是我們的職責。那么話又說回來,在Restfual api 上如何實現第三方登錄呢?我在Segmentfault上找不到我想要的答案,不過最終我也實現了,我把我的實現思路寫出來,當然這只是我的一種實現方式,要是大家有更好的方法呢,樂意交流。
需求分析1、用Restfual api的架構實現第三方登錄,如QQ,微信登錄等。
效果圖 實現思路1、建兩個表,user表和user_login表。user表我就不詳說了,這是基本表,我重點說一下user_login表。
user_login表字段:
id id user_id 用戶id type 登錄類型(如:QQ,weixin) qq_access_token QQ授權access_token qq_openid QQ openid wx_access_token 微信授權access_token wx_openid 微信openid
要是還有微博或者淘寶之類的其他第三方登錄就如以上的規律加上對應的字段就行了。
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); //保證返回數據字段一致 } 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);//保證返回數據字段一致 } 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; //返回給手機端用,只返回access_token和appsercert。 } }
好了,到這里Restfual api 架構的第三方登錄已經實現了,微博,淘寶等第三方登錄實現的思路也如此,就是要對傳入的參數進行改進一下就OK了。這是我實現Restfual api架構的第三方登錄的思路,不足的提議,好的點贊哈,我們一起交流。
設想與問題1、直接在user表里加上QQ、weixin的type,openid和access_token字段,這種做法拓展性不好,以后要是再增加如:微博,淘寶等第三方登錄的話,又要操作user表,對user表操作過于頻繁容易出問題,而且也不是每一個用戶都會使用第三方登錄,會造成大量空缺字段,浪費。我之所以獨立創建user_login表也正是基于這些考慮的。
2、返回給手機端所有的用戶信息。其實手機端不需要那些,你只要返回給手機端access_token和appsercert這兩個字段就可以了,手機端會自己獲取用戶信息。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79527.html
摘要:需求分析用的架構實現第三方登錄,如,微信登錄等。好了,到這里架構的第三方登錄已經實現了微博,淘寶等第三方登錄實現的思路也如此,就是要對傳入的參數進行改進一下就了。 序言 第三方登錄的使用在當今非常普遍,不管是PC端還是手機端都很常見。因為它有著一號多用的特點,不管是在什么網站什么軟件上只要有了這個第三方登錄的功能就無需再次走注冊步驟,直接用第三方的賬號登錄就可以了,方便吧?開發程序看重...
摘要:需求分析用的架構實現第三方登錄,如,微信登錄等。好了,到這里架構的第三方登錄已經實現了微博,淘寶等第三方登錄實現的思路也如此,就是要對傳入的參數進行改進一下就了。 序言 第三方登錄的使用在當今非常普遍,不管是PC端還是手機端都很常見。因為它有著一號多用的特點,不管是在什么網站什么軟件上只要有了這個第三方登錄的功能就無需再次走注冊步驟,直接用第三方的賬號登錄就可以了,方便吧?開發程序看重...
摘要:每個服務運行在其獨立的進程中,服務與服務間采用輕量級的通信機制互相溝通通常是基于的。在微服務架構下,故障會被隔離在單個服務中。 1. 源碼下載地址 源碼鏈接: https://github.com/samt007/xy... 這是用Spring Cloud微服務架構搭建的一套基于EBS的API服務系統如對本文有任何的疑問,請聯系我:samt007@qq.com 2. Introduc...
閱讀 1028·2023-04-26 02:26
閱讀 2134·2021-09-26 10:16
閱讀 1544·2019-08-30 12:57
閱讀 3461·2019-08-29 16:10
閱讀 3213·2019-08-29 13:47
閱讀 1182·2019-08-29 13:12
閱讀 2135·2019-08-29 11:11
閱讀 1330·2019-08-26 13:28