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