Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Slimmest OpenID实现?_Php_Openid - Fatal编程技术网

Php Slimmest OpenID实现?

Php Slimmest OpenID实现?,php,openid,Php,Openid,是否有低于5K或至少低于10K的OpenID实现 请使用以下设置格式化代码以获得真实大小: 缩进: 缩进样式:{K&R(一个真正的大括号样式)} 缩进为:{Tabs} 开始缩进:[1] 缩进:[1] 常见的: [x]删除所有注释 [x]删除空行 [x]将分配语句很好地对齐 []在if、while、for、foreach、declare和catch语句之后放置一条带有条件的注释 改进: [x]删除只带分号(;)的行 [x]从perl注释(#)中做出普通注释(//) [x]制作长开口标签( 括号:

是否有低于5K或至少低于10K的OpenID实现

请使用以下设置格式化代码以获得真实大小:

缩进: 缩进样式:
{K&R(一个真正的大括号样式)}

缩进为:
{Tabs}

开始缩进:
[1]

缩进:
[1]

常见的:
[x]
删除所有注释
[x]
删除空行
[x]
将分配语句很好地对齐
[]
在if、while、for、foreach、declare和catch语句之后放置一条带有条件的注释

改进:
[x]
删除只带分号(;)的行
[x]
从perl注释(#)中做出普通注释(//)
[x]
制作长开口标签( 括号:
[x]
括号内的空格
-()

[x]
空括号内的空格
-()

[x]
块括号内的空格
-[]

[x]
空块括号内的空格
-[]

编辑: 看起来很好,不是很完美,但已经达到了。顺便说一句:这是6.4K,所以它不再是最小的,但我正在经历它来清理更多

<?php
    class openID {
        function __construct( $url = null, $realm = null, $return = null, $redirect = true, $verify = false ) {
            $data = array( );
            if ( ( $verify !== true ) && ( self::Value( $_REQUEST, 'openid_mode' ) !== false ) ) {
                if ( strcmp( 'id_res', self::Value( $_REQUEST, 'openid_mode' ) ) === 0 ) {
                    $data[ 'openid.sig' ]          = $_REQUEST[ 'openid_sig' ];
                    $data[ 'openid.mode' ]         = 'check_authentication';
                    $data[ 'openid.signed' ]       = $_REQUEST[ 'openid_signed' ];
                    $data[ 'openid.assoc_handle' ] = $_REQUEST[ 'openid_assoc_handle' ];
                    if ( array_key_exists( 'openid_op_endpoint', $_REQUEST ) === true ) {
                        $data[ 'openid.ns' ] = 'http://specs.openid.net/auth/2.0';
                    }
                    foreach ( explode( ',', self::Value( $_REQUEST, 'openid_signed' ) ) as $value ) {
                        $data[ 'openid.' . $value ] = $_REQUEST[ 'openid_' . str_replace( '.', '_', $value ) ];
                    }
                    if ( preg_match( '~is_valid\s*:\s*true~i', self::CURL( self::__construct( $_REQUEST[ 'openid_identity' ], false, false, false, true ), $data, 'POST' ) ) > 0 ) {
                        return self::Value( $_REQUEST, 'openid_claimed_id', self::Value( $_REQUEST, 'openid_identity' ) );
                    }
                }
            } else if ( ( $result = self::CURL( $url ) ) !== false ) {
                $xml    = self::XML( $result );
                $server = strval( self::XML( $xml, '//xrd/service/uri', 0 ) );
                if ( empty( $server ) === true ) {
                    $server = strval( self::XML( $xml, '//head/link[@rel="openid.server" or @rel="openid2.provider"]/@href', 0 ) );
                }
                if ( self::URL( $server ) === true ) {
                    if ( $redirect === true ) {
                        $realm    = ( isset( $realm ) === true ) ? $realm : sprintf( '%s://%s/', $_SERVER[ "HTTPS" ] ? "https" : "http", $_SERVER[ 'HTTP_HOST' ] );
                        $return   = ( isset( $return ) === true ) ? $return : sprintf( '%s://%s', $_SERVER[ "HTTPS" ] ? "https" : "http", $_SERVER[ 'HTTP_HOST' ] . $_SERVER[ 'REQUEST_URI' ] );
                        $delegate = ( preg_match( '~http://specs[.]openid[.]net/auth/2[.]0/server~', $result ) > 0 ) ? 'http://specs.openid.net/auth/2.0/identifier_select' : $url;
                        if ( preg_match( '~rel="openid[.]delegate"|<[^>]*Delegate[^>]*>~i', $result ) > 0 ) {
                            $delegate = parent::Value( ph()->Text->Regex( $result, '<([^>]*)Delegate[^>]*>([^>]+)</\1Delegate>', 1 ), 0 );
                            if ( empty( $delegate ) === true ) {
                                $delegate = strval( self::XML( $xml, '//head/link[@rel="openid.delegate"]/@href', 0, $delegate ) );
                            }
                        }
                        if ( preg_match( '~rel="openid2[.]provider"|http://specs[.]openid[.]net/auth/2[.]0~i', $result ) > 0 ) {
                            $data[ 'openid.ns' ] = 'http://specs.openid.net/auth/2.0';
                            if ( preg_match( '~rel="openid2[.]local_id"|<(Local|Canonical)ID[^>]*>~i', $result ) > 0 ) {
                                $delegate = self::Value( self::Regex( $result, '<(Local|Canonical)ID[^>]*>([^>]+)</\1ID>', 1 ), 0 );
                                if ( empty( $delegate ) === true ) {
                                    $delegate = strval( self::XML( $xml, '//head/link[@rel="openid2.local_id"]/@href', 0, $delegate ) );
                                }
                            }
                        }
                        $data[ 'openid.mode' ]                                                                                = 'checkid_setup';
                        $data[ 'openid.return_to' ]                                                                           = $return;
                        $data[ 'openid.claimed_id' ]                                                                          = $data[ 'openid.identity' ] = $delegate;
                        $data[ 'openid.' . ( ( array_key_exists( 'openid.ns', $data ) === true ) ? 'realm' : 'trust_root' ) ] = $realm;
                        self::Redirect( sprintf( '%s%s%s', $server, ( strpos( $server, '?' ) !== false ) ? '&' : '?', http_build_query( $data, '', '&' ) ) );
                    }
                    return $server;
                }
            }
            return false;
        }
        function CURL( $url, $data = null, $method = "GET", $options = array( ) ) {
            $result = false;
            if ( ( extension_loaded( "curl" ) === true ) && ( $this->URL( $url ) === true ) ) {
                $curl = curl_init( $url );
                if ( is_resource( $curl ) === true ) {
                    curl_setopt( $curl, CURLOPT_FAILONERROR, true );
                    curl_setopt( $curl, CURLOPT_AUTOREFERER, true );
                    curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
                    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
                    curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, false );
                    curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
                    if ( preg_match( "~^GET$~i", $method ) > 0 ) {
                        curl_setopt( $curl, CURLOPT_HTTPGET, true );
                    } else if ( preg_match( "~^POST$~i", $method ) > 0 ) {
                        curl_setopt( $curl, CURLOPT_POST, true );
                        curl_setopt( $curl, CURLOPT_POSTFIELDS, $data );
                    }
                    $result = curl_exec( $curl );
                    if ( $result !== false ) {
                        curl_close( $curl );
                    }
                }
            }
            return $result;
        }
        function Redirect( $url, $permanent = false ) {
            if ( headers_sent() !== true ) {
                header( "Location: " . $url, true, ( $permanent === true ) ? 301 : 302 );
            }
            exit( );
        }
        function Regex( $string, $pattern, $key = null, $modifiers = null, $flag = PREG_PATTERN_ORDER, $default = false ) {
            $matches = array( );
            if ( preg_match_all( "~" . $pattern . "~" . $modifiers, $string, $matches, $flag ) > 0 ) {
                if ( isset( $key ) === true ) {
                    return ( $key === true ) ? $matches : Value( $matches, $key, $default );
                }
                return true;
            }
            return $default;
        }
        function URL( $value ) {
            return (bool) filter_var( $value, FILTER_VALIDATE_URL );
        }
        function Value( $data, $key = null, $default = false ) {
            if ( isset( $key ) === true ) {
                foreach ( (array) $key as $value ) {
                    if ( is_object( $data ) === true ) {
                        $data = get_object_vars( $data );
                    }
                    if ( array_key_exists( $value, (array) $data ) !== true ) {
                        return $default;
                    }
                    $data = $data[ $value ];
                }
            }
            return $data;
        }
        function XML( $xml, $xpath = null, $key = null, $default = false ) {
            if ( extension_loaded( "SimpleXML" ) === true ) {
                libxml_use_internal_errors( true );
                if ( ( is_string( $xml ) === true ) && ( class_exists( "DOMDocument" ) === true ) ) {
                    $dom = new DOMDocument();
                    if ( $dom->loadHTML( $xml ) === true ) {
                        return $this->XML( simplexml_import_dom( $dom ), $xpath, $key, $default );
                    }
                } else if ( is_object( $xml ) === true ) {
                    if ( isset( $xpath ) === true ) {
                        $xml = $xml->xpath( $xpath );
                        if ( isset( $key ) === true ) {
                            $xml = $this->Value( $xml, $key, $default );
                        }
                    }
                    return $xml;
                }
            }
            return false;
        }
    }
    new openID( "https://www.google.com/accounts/o8/id" );
?>

我知道最瘦的openid实现是

它有30kb的注释,所以如果你通过格式化程序运行它,它会变得更小

编辑:我找到了一个更小的(重新格式化后只有6.6KB)

精简Lightopenid 首先,我真的不明白你的文件大小限制。如果你问我,我觉得这有点狗屎

您可以对lightopenid创建一个调用图(使用某种死代码检测器)来查看您正在使用的函数(只使用了少数函数)。许多这些大函数不是标准函数,例如,我相信您可以删除大函数
受保护的函数请求流($url,$method='GET',$params=array())
第198行。
我还删除了一些与
示例google.php
示例一起使用时不使用的其他函数。我的最后一个类是这样的(我打赌在使用调用图/死代码检测器时,您甚至可以删除更多代码)

但是现在我把文件大小降到了9.8KB。如果你压缩它,你可以得到更多。我把它降到了你想要的10K标记,但是现在代码已经不能被人类读取了

代码搜索: 您还可以查看这些资源/搜索,看看是否有更轻的(我非常怀疑):

灵感来源和部分(取决于其他5种方法):

public static function OpenID($id, $realm = null, $return = null, $verify = true)
{
    $data = array();

    if (($verify === true) && (array_key_exists('openid_mode', $_REQUEST) === true))
    {
        $result = parent::Value($_REQUEST, 'openid_claimed_id', parent::Value($_REQUEST, 'openid_identity'));

        if (strcmp('id_res', parent::Value($_REQUEST, 'openid_mode')) === 0)
        {
            $data['openid.mode'] = 'check_authentication';

            foreach (array('ns', 'sig', 'signed', 'assoc_handle') as $key)
            {
                $data['openid.' . $key] = parent::Value($_REQUEST, 'openid_' . $key);

                if (strcmp($key, 'signed') === 0)
                {
                    foreach (explode(',', parent::Value($_REQUEST, 'openid_signed')) as $value)
                    {
                        $data['openid.' . $value] = parent::Value($_REQUEST, 'openid_' . str_replace('.', '_', $value));
                    }
                }
            }

            return (preg_match('~is_valid\s*:\s*true~', self::CURL(self::OpenID($result, false, false, false), array_filter($data, 'is_string'), 'POST')) > 0) ? $result : false;
        }
    }

    else if (($result = self::XML(self::CURL($id))) !== false)
    {
        $server = null;
        $protocol = array
        (
            array('specs.openid.net/auth/2.0/server', 'specs.openid.net/auth/2.0/signon', array('openid2.provider', 'openid2.local_id')),
            array('openid.net/signon/1.1', 'openid.net/signon/1.0', array('openid.server', 'openid.delegate')),
        );

        foreach ($protocol as $key => $value)
        {
            while ($namespace = array_shift($value))
            {
                if (is_array($namespace) === true)
                {
                    $server = strval(self::XML($result, sprintf('//head/link[contains(@rel, "%s")]/@href', $namespace[0]), 0));
                    $delegate = strval(self::XML($result, sprintf('//head/link[contains(@rel, "%s")]/@href', $namespace[1]), 0, $id));
                }

                else if (is_object($xml = self::XML($result, sprintf('//xrd/service[contains(type, "http://%s")]', $namespace), 0)) === true)
                {
                    $server = parent::Value($xml, 'uri');

                    if ($key === 0)
                    {
                        $delegate = 'http://specs.openid.net/auth/2.0/identifier_select';

                        if (strcmp($namespace, 'specs.openid.net/auth/2.0/server') !== 0)
                        {
                            $delegate = parent::Value($xml, 'localid', parent::Value($xml, 'canonicalid', $id));
                        }
                    }

                    else if ($key === 1)
                    {
                        $delegate = parent::Value($xml, 'delegate', $id);
                    }
                }

                if (ph()->Is->URL($server) === true)
                {
                    if (($realm !== false) && ($return !== false))
                    {
                        $data['openid.mode'] = 'checkid_setup';
                        $data['openid.identity'] = $delegate;
                        $data['openid.return_to'] = parent::URL($return, null, null);

                        if ($key === 0)
                        {
                            $data['openid.ns'] = 'http://specs.openid.net/auth/2.0';
                            $data['openid.realm'] = parent::URL($realm, false, false);
                            $data['openid.claimed_id'] = $delegate;
                        }

                        else if ($key === 1)
                        {
                            $data['openid.trust_root'] = parent::URL($realm, false, false);
                        }

                        parent::Redirect(parent::URL($server, null, $data));
                    }

                    return $server;
                }
            }
        }
    }

    return false;
}
OpenID('https://www.google.com/accounts/o8/id');
用法:

public static function OpenID($id, $realm = null, $return = null, $verify = true)
{
    $data = array();

    if (($verify === true) && (array_key_exists('openid_mode', $_REQUEST) === true))
    {
        $result = parent::Value($_REQUEST, 'openid_claimed_id', parent::Value($_REQUEST, 'openid_identity'));

        if (strcmp('id_res', parent::Value($_REQUEST, 'openid_mode')) === 0)
        {
            $data['openid.mode'] = 'check_authentication';

            foreach (array('ns', 'sig', 'signed', 'assoc_handle') as $key)
            {
                $data['openid.' . $key] = parent::Value($_REQUEST, 'openid_' . $key);

                if (strcmp($key, 'signed') === 0)
                {
                    foreach (explode(',', parent::Value($_REQUEST, 'openid_signed')) as $value)
                    {
                        $data['openid.' . $value] = parent::Value($_REQUEST, 'openid_' . str_replace('.', '_', $value));
                    }
                }
            }

            return (preg_match('~is_valid\s*:\s*true~', self::CURL(self::OpenID($result, false, false, false), array_filter($data, 'is_string'), 'POST')) > 0) ? $result : false;
        }
    }

    else if (($result = self::XML(self::CURL($id))) !== false)
    {
        $server = null;
        $protocol = array
        (
            array('specs.openid.net/auth/2.0/server', 'specs.openid.net/auth/2.0/signon', array('openid2.provider', 'openid2.local_id')),
            array('openid.net/signon/1.1', 'openid.net/signon/1.0', array('openid.server', 'openid.delegate')),
        );

        foreach ($protocol as $key => $value)
        {
            while ($namespace = array_shift($value))
            {
                if (is_array($namespace) === true)
                {
                    $server = strval(self::XML($result, sprintf('//head/link[contains(@rel, "%s")]/@href', $namespace[0]), 0));
                    $delegate = strval(self::XML($result, sprintf('//head/link[contains(@rel, "%s")]/@href', $namespace[1]), 0, $id));
                }

                else if (is_object($xml = self::XML($result, sprintf('//xrd/service[contains(type, "http://%s")]', $namespace), 0)) === true)
                {
                    $server = parent::Value($xml, 'uri');

                    if ($key === 0)
                    {
                        $delegate = 'http://specs.openid.net/auth/2.0/identifier_select';

                        if (strcmp($namespace, 'specs.openid.net/auth/2.0/server') !== 0)
                        {
                            $delegate = parent::Value($xml, 'localid', parent::Value($xml, 'canonicalid', $id));
                        }
                    }

                    else if ($key === 1)
                    {
                        $delegate = parent::Value($xml, 'delegate', $id);
                    }
                }

                if (ph()->Is->URL($server) === true)
                {
                    if (($realm !== false) && ($return !== false))
                    {
                        $data['openid.mode'] = 'checkid_setup';
                        $data['openid.identity'] = $delegate;
                        $data['openid.return_to'] = parent::URL($return, null, null);

                        if ($key === 0)
                        {
                            $data['openid.ns'] = 'http://specs.openid.net/auth/2.0';
                            $data['openid.realm'] = parent::URL($realm, false, false);
                            $data['openid.claimed_id'] = $delegate;
                        }

                        else if ($key === 1)
                        {
                            $data['openid.trust_root'] = parent::URL($realm, false, false);
                        }

                        parent::Redirect(parent::URL($server, null, $data));
                    }

                    return $server;
                }
            }
        }
    }

    return false;
}
OpenID('https://www.google.com/accounts/o8/id');


PS:我已经更新了我之前发布的代码,因为它是次优的,并且容易出现一些错误。

为什么它需要在10K以下?因为我的CMS每个文件大约有10K,(目前有2个文件)我希望所有内容都尽可能薄。:)我当前的CMS大小是462,lightopenid最小化到我的格式,给了我469行,它加倍了我的代码库,我不知道什么大文件被包括在内,好吧,我知道它一点也不大,但我想有整个项目在30K以下的结束。如果我加上这个lightopenid,已经超过3万了。问题是:为什么?你对某种设备有大小限制吗?因为对于“正常”目的而言,更少的字节并不意味着“更快”。这是你的应用程序,可以做你喜欢做的事情,但出于好奇,甚至可能避免基于非问题的“限制”,我也很好奇你为什么想要它“苗条”。e、 g:在我看来,这不是一个确保速度的好方法。@James你在用一种完全错误的方式进行优化。试图避免一次
require\u
呼叫所浪费的时间?这是如此毫无意义,令人震惊。您可以消除一千次
require_
调用,但性能不会有任何明显的提高。哼,重新格式化,得到17.4K,这就更好了。:)如果你正在寻找其他人,看看这个网站,这会允许我的用户登录,除了上面的内容之外什么都不做吗???@JamesM:不,你需要使用helper方法。。。我已经把它们添加到我的答案中。整个过程只需要5KB,但如果您愿意,可以进一步优化它。@Alfred:我发布的代码没有外部依赖项,只有5KB。@Alix以这行=>ph()->is->URL($URL)===true为例。此ph()不在PHP语言/库中?=>@阿尔弗雷德:
ph()
来自。当我删除依赖项时,我忘记用
URL()
函数替换它。应立即修复。=)仍然可以被人用php格式化程序发送,请看问题的第一部分:)同样最小化的php仍然可以自己阅读,这并不容易。顺便说一句:我希望它尽可能小,这样我就可以改进它,并将它作为插件添加到我的cms中,整个项目的目标是变得苗条和快速。Slim并不总是意味着快速,我确实知道,但在我的情况下,它是,我已经尝试了堆代码与我的小代码,它工作得很好,我仍然可能最终阅读openid规范并编写我自己的更精简的版本,只有我需要的。