spiderrobb / signed-request

支持多种功能和哈希算法的编码和解码SignedRequests的简单类

v1.0.0 2015-05-15 07:29 UTC

This package is not auto-updated.

Last update: 2024-09-28 14:48:04 UTC


README

Build Status

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);
}