Restful API アーキテクチャのサードパーティ ログイン
はじめに
今日、PC であれ携帯電話であれ、サードパーティのログインの使用は非常に一般的です。多目的に利用できる特徴があるため、どのようなWebサイトやソフトウェアであっても、このサードパーティログイン機能があれば、再度登録手順を踏む必要はなく、そのままログインすることができます。サードパーティのアカウントを使用すると便利ですよね。プログラム開発で重要なのはユーザーエクスペリエンスであり、ユーザーにとって「小さくてもすべての機能が備わった」使いやすい製品を作ることが私たちの責任です。それでは、Restful API にサードパーティ ログインを実装するにはどうすればよいでしょうか? Segmentfault では希望する答えが見つかりませんでしたが、最終的には実装アイデアを書き留めました。もちろん、これは私の実装方法の 1 つにすぎません。誰かがより良い方法を持っている場合は、喜んで書きます。通信する。 。
要件分析
1. Restful API アーキテクチャを使用して、QQ、WeChat ログインなどのサードパーティ ログインを実装します。
レンダリング
実装のアイデア
1. user テーブルと user_login テーブルの 2 つのテーブルを作成します。 user テーブルについては詳しく説明しません。ここでは user_login テーブルに焦点を当てます。 user_login テーブルのフィールド:
id iduser_id 用户idtype 登录类型(如:QQ,weixin) qq_access_token QQ授权access_tokenqq_openid QQ openidwx_access_token 微信授权access_tokenwx_openid 微信openid
Weibo や Taobao などの他のサードパーティ ログインがある場合は、上記のルールに従って対応するフィールドを追加するだけです。
2. gii によって生成される UserLogin.php モデルは次のとおりです。
<?phpclass UserLogin extends /yii/db/ActiveRecord{ /** * @inheritdoc */ public static function tableName() { return 'user_login'; } /** * @inheritdoc */ public function rules() { return [ [['user_id'], 'integer'], [['type'], 'string', 'max' => 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')); } }
WeChat ログイン
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 モデルでのサードパーティのログインによる基本的なユーザー情報の取得方法:
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。 } }
さて、Restful API アーキテクチャが登場しました。サードパーティ ログインが実装されました。Weibo や Taobao などのサードパーティ ログインを実装するという考え方も同じです。つまり、改善しても大丈夫です。受信パラメータ。これは、Restful API アーキテクチャのサードパーティ ログインを実装するための私のアイデアです。十分ではない提案があれば、良い提案をして、一緒にコミュニケーションしましょう。
アイデアと問題点
1. QQ と weixin の type、openid、access_token フィールドを直接追加するこのアプローチは、将来さらに追加する場合、拡張性が低くなります。例: Weibo 、タオバオなどのサードパーティ ログインでユーザー テーブルを操作する必要がある場合、ユーザー テーブルの操作が頻繁すぎると問題が発生しやすく、すべてのユーザーがサードパーティ ログインを使用するわけではないため、大量の空き地と廃棄物。 user_login テーブルを独自に作成した理由は、これらの考慮事項に基づいています。 2. すべてのユーザー情報を携帯電話に返します。実際には、モバイル端末はこれらを必要とせず、access_token と appercert の 2 つのフィールドをモバイル端末に返すだけでよく、モバイル端末は自らユーザー情報を取得します。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック











多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

2012年のFacebookによる有名な買収に続いて、Instagramはサードパーティの使用のために2セットのAPIを採用しました。これらはInstagramグラフAPIとInstagram Basic Display APIです。

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています
