Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.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 如何正确使用持票人代币?_Php_Authentication_Oauth_Http Headers_Bearer Token - Fatal编程技术网

Php 如何正确使用持票人代币?

Php 如何正确使用持票人代币?,php,authentication,oauth,http-headers,bearer-token,Php,Authentication,Oauth,Http Headers,Bearer Token,我在PHP中制作了一个授权系统,我看到了这个传递JWT令牌的承载方案。我有以下疑问: 这是如何提高安全性的 在成功授权和登录后,服务器在其主体中使用JWT令牌响应客户端,现在当客户端发出另一个请求时,我不清楚如何实际执行该操作,我想在请求的授权头中从客户端发送令牌,所以现在我应该只加前缀“Bearer”对于我在上一个响应中从服务器收到的令牌,如果是,那么服务器在收到授权头时,应该只使用空格分割字符串,并从获得的数组中获取第二个值,然后对其进行解码?例如,Authorization:Bearer-

我在
PHP
中制作了一个授权系统,我看到了这个传递JWT令牌的承载方案。我有以下疑问:

  • 这是如何提高安全性的
  • 在成功授权和登录后,服务器在其主体中使用JWT令牌响应客户端,现在当客户端发出另一个请求时,我不清楚如何实际执行该操作,我想在请求的授权头中从客户端发送令牌,所以现在我应该只加前缀“Bearer”对于我在上一个响应中从服务器收到的令牌,如果是,那么服务器在收到授权头时,应该只使用空格分割字符串,并从获得的数组中获取第二个值,然后对其进行解码?例如,
    Authorization:Bearer-fdbgfbfgbjhg\u something
    ,服务器应该如何处理这个问题,
    decodeFunc(explode(“,$this->getRequest()->getHeader(“Authorization”)[1])

  • 1.提高安全性,因为如果在url中发送的标头中未发送令牌,则将由网络系统、服务器日志…记录令牌

    2.一个很好的获取持票人代币的功能

    /** 
     * Get header Authorization
     * */
    function getAuthorizationHeader(){
            $headers = null;
            if (isset($_SERVER['Authorization'])) {
                $headers = trim($_SERVER["Authorization"]);
            }
            else if (isset($_SERVER['HTTP_AUTHORIZATION'])) { //Nginx or fast CGI
                $headers = trim($_SERVER["HTTP_AUTHORIZATION"]);
            } elseif (function_exists('apache_request_headers')) {
                $requestHeaders = apache_request_headers();
                // Server-side fix for bug in old Android versions (a nice side-effect of this fix means we don't care about capitalization for Authorization)
                $requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders));
                //print_r($requestHeaders);
                if (isset($requestHeaders['Authorization'])) {
                    $headers = trim($requestHeaders['Authorization']);
                }
            }
            return $headers;
        }
    /**
     * get access token from header
     * */
    function getBearerToken() {
        $headers = getAuthorizationHeader();
        // HEADER: Get the access token from the header
        if (!empty($headers)) {
            if (preg_match('/Bearer\s(\S+)/', $headers, $matches)) {
                return $matches[1];
            }
        }
        return null;
    }
    

    我建议使用以下正则表达式来检查它是否是有效的jwt令牌:

    /Bearer\s((.*)\.(.*)\.(.*))/
    
    并使用匹配项[1]访问它


    这是JWT令牌的结构,请参见:

    这是一个很好的函数,您已经建议过了,但是我返回的
    $headers
    会有,比如说:
    Bearer
    ,那么现在,将字符串按空格分解并获取实际的令牌,还是完整的字符串
    (Bearer)
    应该作为一个整体吗?
    没错。你可以按空间爆炸,我错过了一个函数。XD您可以添加setBearerToken函数吗?我只需要使用substr()来获取实际的令牌,而不是承载者。应该比preg_match()快得多。除非无法使用现有的PHP字符串函数,否则正则表达式并不总是解析字符串的推荐方法。正则表达式用于查找模式。在我看来,您可以使用正则表达式解析格式为“Bearer”的jwt令牌。我相信这是我能想到的最好的方法,当涉及到令牌验证时。被接受的答案也使用正则表达式。我不知道为什么这会被否决,即使它有更好的正则表达式。这根本不是一个好方法。JWT令牌可以使用私有/公共证书进行签名,regex不会对此进行检查。