谈谈自己对于Auth2.0的见解
生活随笔
收集整理的這篇文章主要介紹了
谈谈自己对于Auth2.0的见解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Auth的原理網上有很多,我這里就不在贅述了。
這里有張時序圖我個人覺得是比較合理而且直觀的,(感謝這篇博文:http://justcoding.iteye.com/blog/1950270)
?
參照這個流程,模擬了下部分代碼,當然是盡可能的以簡單的形式去表達下自己的見解
模擬了配置文件去掉數據庫處理的部分
config.php 定義了公司及對應的操作用戶的權限
<?php return array('app'=>array('a1'=>array('accesskey'=>'123456',//憑證'type'=>0,//聚合這里規定type對應的請求權限'appname'=>'gavinjun',),),'type'=>array(array('獲取用戶的信息','獲取用戶的金錢',),), );user_config.php 用戶表的模擬
<?php return array('admin'=>'123456', );?
<?php //權限2.0的主程 class Auto{private $vession=2.0;private $notic=null;public function __construct(){$notic = require 'config.php';$this->notic = $notic;}//校驗商戶public function check($_param=array()){if(empty($_param)){return false;}//獲取傳過來的accesskey appid$appid = !empty($_param['appid'])?$_param['appid']:0;$accesskey=!empty($_param['accesskey'])?$_param['accesskey']:'';if(!$appid||!$accesskey)return false;//校驗開始$notic = $this->notic;return $notic['app'][$appid]?$notic['app'][$appid]['accesskey']==$accesskey:false;}//用戶發起登錄請求public function getLoginCallBack($_param){if($this->check($_param)){//校驗通過返回臨時的token 以下都是不安全的方式只是模擬auto的流程//這里可以用加密 請求時間|請求完成后跳轉地址|用戶的md5(accesskey)return time().'|'.$_param['redirect'].'|'.md5($_param['accesskey']).'|'.$_param['appid'];}else{echo '商戶未注冊';return false;}}//用戶輸入完用戶名和密碼之后public function inLogin($name,$pwd){$user = require("user_config.php");return $user[$name]?$user[$name]==$pwd:false;}//用戶登錄完成后帶著token值來請求我們的令牌public function getAceess($_param){$token = $_param['access_token'];if(!$token)return false;list($time,$redirect,$authkey,$appid) = explode('|',$token);//請求$appid 獲取他的accesskey$notic = $this->notic;$accesskey = $notic['app'][$appid]['accesskey'];if(time()>$time+5*60){//超過5分鐘才請求默認失敗return false;}if(md5($accesskey)!=$authkey){//鏈接不安全return false;}//返回正式的key//這個key可以保存在數據庫中設置這個key的失效時間 //我這里隨便固定了他的accesskey//給跳轉的頁面發送一個key 用post的應該,不過模擬就算了$access = 'success';return $redirect.'?access='.$access;}public function doSomeByaccess($access){//和數據庫中做比對 這里不寫了,就全部默認成功if($access){$appid = 'a1';}$notic = $this->notic;$type = $notic['app'][$appid]['type'];foreach($notic['type'][$type] as $v){echo '用戶權限:'.$v.'<br>';}} }這里是模擬下這段程序的流程
<?php //模擬流程 require 'auth2.php'; $auth2= new Auto();//step 1: 用戶點擊平臺上的登錄按鈕 //該商戶的信息 appid=a1,accesskey=123456 $step1=$auth2->getLoginCallBack(array('appid'=>'a1','accesskey'=>'123456','redirect'=>'http://www.baidu.com')); //系統內部跳轉到登錄界面拿到臨時token 讓用戶去登錄授權 $access_token = $step1; /**系統內部的處理流程***/ //系統跳到登錄地址?access_token=$step1 用戶輸入用戶名和密碼 //模擬用戶授權 if($auth2->inLogin('admin','123456')){//用戶同意登錄返回了一個令牌$access_token是用戶登錄請求的時候帶上的$arr['access_token']=$access_token;$url = $auth2->getAceess($arr);//這個url會發送給平臺,平臺拿到這個 令牌可以去訪問用戶信息echo $url; } /****系統內部處理結束跳轉到用戶平臺地址,發送post信息****/ //假設平臺接到這個信息他保存下來了這個accesskey,去讀取一遍用戶的信息 $url = parse_url($url); list($access,$accesskey)=explode('=',$url['query']); $auth2->doSomeByaccess($accesskey);結果:
轉載于:https://www.cnblogs.com/gavinjunftd/p/5126638.html
總結
以上是生活随笔為你收集整理的谈谈自己对于Auth2.0的见解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Spring学习笔记-MVC-17】S
- 下一篇: 百词斩和扇贝打卡测试与评估