spiderrobb / signed-request
支持多种功能和哈希算法的编码和解码SignedRequests的简单类
Requires
- php: >=5.2.0
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2024-09-28 14:48:04 UTC
README
SignedRequest类是编码和解码签名字符串的一种简单且功能丰富的途径。签名字符串被Facebook、Kongregate和Salesforce等公司用于以安全可靠的方式将数据传递给第三方应用程序。
注意:SignedRequest不会加密您的数据,它会编码您的数据。任何人都可以读取SignedRequest中的所有数据。当您希望信任数据时,SignedRequest非常有用。
##格式
一个签名字符串是由HMAC SHA-256(默认为HMAC SHA-256)签名字符串、一个点(.)和一个base64url编码的JSON对象拼接而成。它看起来像这样(不包含换行符)。
vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso
.
eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0
签名字符串由签名和有效负载组成 SIGNATURE.PAYLOAD
##基本用法
签名字符串最基本的使用是将数据与一个秘密进行编码,并通过HTTP POST或GET传递数据,然后使用相同的秘密解码签名字符串。最简单的用法是
// File that is encoding Signed Request // ------------------------------------ // defining secret to encode data with $mySecret = '[My Super Secret String]'; // defining data to encode in signed request // Note: myData does not need to be an array, it can be an Array, String, Boolean... etc. $myData = array( 'dataKey' => 'dataValue' ); $mySR = SignedRequest::encode( $myData, array('secret' => $mySecret) ); // File That is decoding Signed Request // ------------------------------------ // defining secret to decode data with $mySecret = '[My Super Secret String]'; // decoding signed request try { // decoding signed request using same secret $myData = SignedRequest::decode( $mySR, array( 'secret' => $mySecret ) ) print_r($myData); } catch (Exception $e) { // signed request has been malformatted or cannot be trusted var_dump($e); } /* output Array( 'dataKey' => 'dataValue' ) */
##功能
###支持多种哈希算法
支持的哈希算法包括php中的所有算法 hash_algos
示例
$mySecret = '[My super secret secret]'; $myData = array( 'dataKey' => 'dataValue' ); $mySR = SignedRequest::encode( $myData, array( 'secret' => $mySecret, 'algorithm' => 'HMAC-SHA1' // (optional) default: HMAC-SHA256 ) );
要获取支持算法的列表,可以使用该函数
$supportedAlgorithms = SignedRequest::getAlgorithms();
###过期日期
指定签名字符串过期特定日期的能力。 (Unix时间戳格式)
示例
$mySecret = '[My super secret secret]'; $myData = array( 'dataKey' => 'dataValue' ); $mySR = SignedRequest::encode( $myData, array( 'secret' => $mySecret, 'expires' => strtotime('2015-01-01 01:00:00') ) );
###到期时间
指定签名字符串到期前的时间长度(以秒为单位)。
示例
$mySecret = '[My super secret secret]'; $myData = array( 'dataKey' => 'dataValue' ); $mySR = SignedRequest::encode( $myData, array( 'secret' => $mySecret, 'timeout' => 3600 // signed request will expire in 1 hour ) );
###方法验证
使用最佳实践,不应在多个情况下使用相同的秘密。比如说,您想对一个object1
进行编码,所以您这样编码数据
$myData = array( 'id' => 153 );
现在您想对一个object2
进行编码,所以您也这样编码它
$myData = array( 'id' => 351 );
如果在两个示例中都使用了相同的秘密,那么有人可能会从object1
中获取秘密,并在不同的上下文中用于object2
。
为了防止这种安全风险,您可以使用方法选项。
示例
// Encoding data in signed request using method attribute $mySecret = '[My super secret secret]'; $myData = array( 'dataKey' => 'dataValue' ); $mySR = SignedRequest::encode( $myData, array( 'method' => 'object1', 'timeout' => 3600 // signed request will expire in 1 hour ) ); // Decoding data in signed request using method attribute try { // decoding signed request using same secret $myData = SignedRequest::decode( $mySR, array( 'method' => 'object1', 'secret' => $mySecret ) ) print_r($myData); } catch (Exception $e) { // signed request has been malformatted or cannot be trusted var_dump($e); }