源码分享站 - 分享有用的

fatfree 展示 openid.php源代码

返回 下载fatfree: 单独下载openid.php源代码 - 下载整个fatfree源代码 - 类型:.php文件
  1. <?php
  2.  
  3. /*
  4.  
  5.         Copyright (c) 2009-2016 F3::Factory/Bong Cosca, All rights reserved.
  6.  
  7.         This file is part of the Fat-Free Framework (http://fatfreeframework.com).
  8.  
  9.         This is free software: you can redistribute it and/or modify it under the
  10.         terms of the GNU General Public License as published by the Free Software
  11.         Foundation, either version 3 of the License, or later.
  12.  
  13.         Fat-Free Framework is distributed in the hope that it will be useful,
  14.         but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.         General Public License for more details.
  17.  
  18.         You should have received a copy of the GNU General Public License along
  19.         with Fat-Free Framework.  If not, see <http://www.gnu.org/licenses/>.
  20.  
  21. */
  22.  
  23. namespace Web;
  24.  
  25. //! OpenID consumer
  26. class OpenID extends \Magic {
  27.  
  28.         protected
  29.                 //! OpenID provider endpoint URL
  30.                 $url,
  31.                 //! HTTP request parameters
  32.                 $args=[];
  33.  
  34.         /**
  35.         *       Determine OpenID provider
  36.         *       @return string|FALSE
  37.         *       @param $proxy string
  38.         **/
  39.         protected function discover($proxy) {
  40.                 // Normalize
  41.                 if (!preg_match('/https?:\/\//i',$this->args['endpoint']))
  42.                         $this->args['endpoint']='http://'.$this->args['endpoint'];
  43.                 $url=parse_url($this->args['endpoint']);
  44.                 // Remove fragment; reconnect parts
  45.                 $this->args['endpoint']=$url['scheme'].'://'.
  46.                         (isset($url['user'])?
  47.                                 ($url['user'].
  48.                                 (isset($url['pass'])?(':'.$url['pass']):'').'@'):'').
  49.                         strtolower($url['host']).(isset($url['path'])?$url['path']:'/').
  50.                         (isset($url['query'])?('?'.$url['query']):'');
  51.                 // HTML-based discovery of OpenID provider
  52.                 $req=\Web::instance()->
  53.                         request($this->args['endpoint'],['proxy'=>$proxy]);
  54.                 if (!$req)
  55.                         return FALSE;
  56.                 $type=array_values(preg_grep('/Content-Type:/',$req['headers']));
  57.                 if ($type &&
  58.                         preg_match('/application\/xrds\+xml|text\/xml/',$type[0]) &&
  59.                         ($sxml=simplexml_load_string($req['body'])) &&
  60.                         ($xrds=json_decode(json_encode($sxml),TRUE)) &&
  61.                         isset($xrds['XRD'])) {
  62.                         // XRDS document
  63.                         $svc=$xrds['XRD']['Service'];
  64.                         if (isset($svc[0]))
  65.                                 $svc=$svc[0];
  66.                         $svc_type=is_array($svc['Type'])?$svc['Type']:array($svc['Type']);
  67.                         if (preg_grep('/http:\/\/specs\.openid\.net\/auth\/2.0\/'.
  68.                                         '(?:server|signon)/',$svc_type)) {
  69.                                 $this->args['provider']=$svc['URI'];
  70.                                 if (isset($svc['LocalID']))
  71.                                         $this->args['localidentity']=$svc['LocalID'];
  72.                                 elseif (isset($svc['CanonicalID']))
  73.                                         $this->args['localidentity']=$svc['CanonicalID'];
  74.                         }
  75.                         $this->args['server']=$svc['URI'];
  76.                         if (isset($svc['Delegate']))
  77.                                 $this->args['delegate']=$svc['Delegate'];
  78.                 }
  79.                 else {
  80.                         $len=strlen($req['body']);
  81.                         $ptr=0;
  82.                         // Parse document
  83.                         while ($ptr<$len)
  84.                                 if (preg_match(
  85.                                         '/^<link\b((?:\h+\w+\h*=\h*'.
  86.                                         '(?:"(?:.+?)"|\'(?:.+?)\'))*)\h*\/?>/is',
  87.                                         substr($req['body'],$ptr),$parts)) {
  88.                                         if ($parts[1] &&
  89.                                                 // Process attributes
  90.                                                 preg_match_all('/\b(rel|href)\h*=\h*'.
  91.                                                         '(?:"(.+?)"|\'(.+?)\')/s',$parts[1],$attr,
  92.                                                         PREG_SET_ORDER)) {
  93.                                                 $node=[];
  94.                                                 foreach ($attr as $kv)
  95.                                                         $node[$kv[1]]=isset($kv[2])?$kv[2]:$kv[3];
  96.                                                 if (isset($node['rel']) &&
  97.                                                         preg_match('/openid2?\.(\w+)/',
  98.                                                                 $node['rel'],$var) &&
  99.                                                         isset($node['href']))
  100.                                                         $this->args[$var[1]]=$node['href'];
  101.  
  102.                                         }
  103.                                         $ptr+=strlen($parts[0]);
  104.                                 }
  105.                                 else
  106.                                         $ptr++;
  107.                 }
  108.                 // Get OpenID provider's endpoint URL
  109.                 if (isset($this->args['provider'])) {
  110.                         // OpenID 2.0
  111.                         $this->args['ns']='http://specs.openid.net/auth/2.0';
  112.                         if (isset($this->args['localidentity']))
  113.                                 $this->args['identity']=$this->args['localidentity'];
  114.                         if (isset($this->args['trust_root']))
  115.                                 $this->args['realm']=$this->args['trust_root'];
  116.                 }
  117.                 elseif (isset($this->args['server'])) {
  118.                         // OpenID 1.1
  119.                         $this->args['ns']='http://openid.net/signon/1.1';
  120.                         if (isset($this->args['delegate']))
  121.                                 $this->args['identity']=$this->args['delegate'];
  122.                 }
  123.                 if (isset($this->args['provider'])) {
  124.                         // OpenID 2.0
  125.                         if (empty($this->args['claimed_id']))
  126.                                 $this->args['claimed_id']=$this->args['identity'];
  127.                         return $this->args['provider'];
  128.                 }
  129.                 elseif (isset($this->args['server']))
  130.                         // OpenID 1.1
  131.                         return $this->args['server'];
  132.                 else
  133.                         return FALSE;
  134.         }
  135.  
  136.         /**
  137.         *       Initiate OpenID authentication sequence; Return FALSE on failure
  138.         *       or redirect to OpenID provider URL
  139.         *       @return bool
  140.         *       @param $proxy string
  141.         *       @param $attr array
  142.         *       @param $reqd string|array
  143.         **/
  144.         function auth($proxy=NULL,$attr=[],array $reqd=NULL) {
  145.                 $fw=\Base::instance();
  146.                 $root=$fw->get('SCHEME').'://'.$fw->get('HOST');
  147.                 if (empty($this->args['trust_root']))
  148.                         $this->args['trust_root']=$root.$fw->get('BASE').'/';
  149.                 if (empty($this->args['return_to']))
  150.                         $this->args['return_to']=$root.$_SERVER['REQUEST_URI'];
  151.                 $this->args['mode']='checkid_setup';
  152.                 if ($this->url=$this->discover($proxy)) {
  153.                         if ($attr) {
  154.                                 $this->args['ns.ax']='http://openid.net/srv/ax/1.0';
  155.                                 $this->args['ax.mode']='fetch_request';
  156.                                 foreach ($attr as $key=>$val)
  157.                                         $this->args['ax.type.'.$key]=$val;
  158.                                 $this->args['ax.required']=is_string($reqd)?
  159.                                         $reqd:implode(',',$reqd);
  160.                         }
  161.                         $var=[];
  162.                         foreach ($this->args as $key=>$val)
  163.                                 $var['openid.'.$key]=$val;
  164.                         $fw->reroute($this->url.'?'.http_build_query($var));
  165.                 }
  166.                 return FALSE;
  167.         }
  168.  
  169.         /**
  170.         *       Return TRUE if OpenID verification was successful
  171.         *       @return bool
  172.         *       @param $proxy string
  173.         **/
  174.         function verified($proxy=NULL) {
  175.                 preg_match_all('/(?<=^|&)openid\.([^=]+)=([^&]+)/',
  176.                         $_SERVER['QUERY_STRING'],$matches,PREG_SET_ORDER);
  177.                 foreach ($matches as $match)
  178.                         $this->args[$match[1]]=urldecode($match[2]);
  179.                 if (isset($this->args['mode']) &&
  180.                         $this->args['mode']!='error' &&
  181.                         $this->url=$this->discover($proxy)) {
  182.                         $this->args['mode']='check_authentication';
  183.                         $var=[];
  184.                         foreach ($this->args as $key=>$val)
  185.                                 $var['openid.'.$key]=$val;
  186.                         $req=\Web::instance()->request(
  187.                                 $this->url,
  188.                                 [
  189.                                         'method'=>'POST',
  190.                                         'content'=>http_build_query($var),
  191.                                         'proxy'=>$proxy
  192.                                 ]
  193.                         );
  194.                         return (bool)preg_match('/is_valid:true/i',$req['body']);
  195.                 }
  196.                 return FALSE;
  197.         }
  198.  
  199.         /**
  200.         *       Return OpenID response fields
  201.         *       @return array
  202.         **/
  203.         function response() {
  204.                 return $this->args;
  205.         }
  206.  
  207.         /**
  208.         *       Return TRUE if OpenID request parameter exists
  209.         *       @return bool
  210.         *       @param $key string
  211.         **/
  212.         function exists($key) {
  213.                 return isset($this->args[$key]);
  214.         }
  215.  
  216.         /**
  217.         *       Bind value to OpenID request parameter
  218.         *       @return string
  219.         *       @param $key string
  220.         *       @param $val string
  221.         **/
  222.         function set($key,$val) {
  223.                 return $this->args[$key]=$val;
  224.         }
  225.  
  226.         /**
  227.         *       Return value of OpenID request parameter
  228.         *       @return mixed
  229.         *       @param $key string
  230.         **/
  231.         function &get($key) {
  232.                 if (isset($this->args[$key]))
  233.                         $val=&$this->args[$key];
  234.                 else
  235.                         $val=NULL;
  236.                 return $val;
  237.         }
  238.  
  239.         /**
  240.         *       Remove OpenID request parameter
  241.         *       @return NULL
  242.         *       @param $key
  243.         **/
  244.         function clear($key) {
  245.                 unset($this->args[$key]);
  246.         }
  247.  
  248. }
  249.  
单独下载 单独下载openid.php源码 - 下载整个fatfree源程序
相关源码/软件:
TSA-Travel-Sentry-master-keys - TSA 主密钥的 3D 再现 2017-05-12
python3-cookbook - 《Python Cookbook》 3rd Edition Translatio 2017-05-12
isso - Disqus 替代 https://posativ.org/isso/ 2017-05-12
hologram - 降价基于文件系统的风格指南。 http://trulia.github.io... 2017-05-12
www.html5rocks.com - .......a 争创一流资源为 web 开发人员 2017-05-12
rolify - Role management library with resource scoping ... 2017-05-13
jquery-mockjax - JQuery Mockjax 插件提供了简单、 极其灵活的接口,以嘲笑或模拟 ajax 请求和响应 2017-05-13
yo - CLI 工具运行自耕农发电机 http://yeoman.io 2017-05-13
GrowingTextView - UITextView 增长/收缩与文本并开始滚动时的含量达到一定数量的行。类似于苹果在 SMS 应用... 2017-05-13
phan - 潘是 php 的静态分析器。潘倾向于避免误报,并试图证明不正确,而不是正确性。 2017-05-13
CRYENGINE - CRYENGINE 是由 Crytek 创建一个功能强大的实时游戏开发平台。 ... 2017-06-11
postal - 2017-06-11
reactide - Reactide 是反应 web 应用程序开发的第一个专用的 IDE。http://reactide... 2017-06-11
rkt - rkt 是为 Linux 的 pod 本机容器引擎。它是可组合、 安全和建筑标准。 2017-06-11
uWebSockets - 小小的 Websocket https://forest.webvrexpe... 2017-06-11
realworld - 真实的世界-动力反应、 角、 节点,Django,和更多的模范 fullstack Medium.c... 2017-06-11
goreplay - GoReplay 是用于捕获和重播活 HTTP 交通到测试环境以不断地测试您的系统与实际数据的开源工... 2017-06-10
pyenv - 简单的 Python 版本管理 2017-06-10
redux-saga - Redux 应用程序替代副作用模型 https://redux-saga.g... 2017-06-10
angular-starter - 2017-06-10

 返回顶部