PHP中的OpenID访问令牌验证

PHP中的OpenID访问令牌验证,php,validation,openid-connect,thinktecture,Php,Validation,Openid Connect,Thinktecture,我正在尝试在PHP中的ThinktectureOpenIDConnect上进行SSO验证 我已经编写了一个客户端并获得了一个访问令牌。但我不知道如何验证它 文件说: 3.2.2.9. 访问令牌验证 要使用ID令牌验证从授权端点发出的访问令牌,客户端应执行以下操作: 将access_令牌的ASCII表示形式的八位字节散列为 JWA[JWA]中为alg头指定的哈希算法 ID令牌头的参数。例如,如果alg是 RS256,使用的哈希算法是SHA-256 取散列的最左边的一半,并对其进行base64ur

我正在尝试在PHP中的ThinktectureOpenIDConnect上进行SSO验证 我已经编写了一个客户端并获得了一个访问令牌。但我不知道如何验证它

文件说: 3.2.2.9. 访问令牌验证

要使用ID令牌验证从授权端点发出的访问令牌,客户端应执行以下操作:

  • 将access_令牌的ASCII表示形式的八位字节散列为 JWA[JWA]中为alg头指定的哈希算法 ID令牌头的参数。例如,如果alg是 RS256,使用的哈希算法是SHA-256

  • 取散列的最左边的一半,并对其进行base64url编码

  • ID令牌中的at_哈希值必须与生成的值匹配 在上一步中

  • 我不知道如何进行第一步。 我得到的ALg是RS256,我从Id标记中得到了at_哈希,我在PHP中找不到一个关于如何进行验证的示例。

    是PHP中计算
    at_哈希值的一个示例,该值应该很容易适应您的环境:

    public function setAccessTokenHash($accessTokenString)
        {
            // bit : 256/384/512 
            if(isset($this->_header['alg']) && $this->_header['alg'] != 'none'){
                $bit = substr($this->_header['alg'], 2, 3);
            }else{
                // TODO: Error case. throw exception???
                $bit = '256';
            }
            $len = ((int)$bit)/16;
            $this->_payload['at_hash'] = Akita_OpenIDConnect_Util_Base64::urlEncode(substr(hash('sha'.$bit, $accessTokenString, true), 0, $len));
        }
    

    我们做了一个变通,得到了Idtoken并进行了验证。