原文链接:http://blog.xiaonei.com/GetEntry.do?id=380771921&owner=253723720
首先到51去申请一个OPENSOCIAL JS应用,这个流程这里就不提了,大家已经很熟悉了。
然后写我们的SIGNED REQUEST请求,这样的请求有利于我们开发者的服务器不会被除container的其他服务器发送的请求干扰。
这里面有一个实例,我们可以去看一下:http://apps.51.com/os_test。
这里是他的xml地址:http://www.unickway.org.cn/opensocial/xml/xml/test/test_xml/ostest.xml
下面是我们的js端的代码:(很简单)。
<code>
var server_url = 'http://www.unickway.org.cn/opensocial/xml/xml/test/test_php/signed_request.php'; //这是要请求的我服务器上的URL
var params = {}; //我要发送的参数
params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED; //叫CONTAINER进行加密发送,最主要的:)
params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
gadgets.io.makeRequest(server_url,function(data){response(data.text);},params); //发送请求,并在response函数接受请求
</code>
下面是我们的server端的代码:(也很简单,这里会用到shindig中的一个OAUTH.php,具体目录是shindig/php/src/gadgets/oauth/oauth.php,一定要用这个文件,其他的oauth.php不好用的:) )
<code>
<?php
require_once("OAuth.php");
class FOSignatureMethod extends OAuthSignatureMethod_RSA_SHA1 {
protected function fetch_public_cert(&$request) {
return <<<EOD
-----BEGIN CERTIFICATE-----
MIICxTCCAi6gAwIBAgIJAKGu1p8ZX0ClMA0GCSqGSIb3DQEBBQUAMEwxCzAJBgNV
BAYTAkdCMRIwEAYDVQQIEwlCZXJrc2hpcmUxEDAOBgNVBAcTB05ld2J1cnkxFzAV
BgNVBAoTDk15IENvbXBhbnkgTHRkMB4XDTA4MTAxNzAyMDkwNloXDTA5MTAxNzAy
MDkwNlowTDELMAkGA1UEBhMCR0IxEjAQBgNVBAgTCUJlcmtzaGlyZTEQMA4GA1UE
BxMHTmV3YnVyeTEXMBUGA1UEChMOTXkgQ29tcGFueSBMdGQwgZ8wDQYJKoZIhvcN
AQEBBQADgY0AMIGJAoGBAMLJ0Jcel8Jnw3dG4vUp7uOiBtRhShUEKD8wXSbjT/H4
vP6Np0wSBE1II0D4rmA6+LEJQp6II+35lnx3QZ4Fwknxg0EsHDrJHxmz47+Jdebg
KHwkdLteubzshqOD0DKpwIvp+tVdmtV9ThAk1k2La7y+O2qEZLnhpMPMh7rtWXc5
AgMBAAGjga4wgaswHQYDVR0OBBYEFK2mxQW2Zilj6YK/Jd8iEOio62tuMHwGA1Ud
IwR1MHOAFK2mxQW2Zilj6YK/Jd8iEOio62tuoVCkTjBMMQswCQYDVQQGEwJHQjES
MBAGA1UECBMJQmVya3NoaXJlMRAwDgYDVQQHEwdOZXdidXJ5MRcwFQYDVQQKEw5N
eSBDb21wYW55IEx0ZIIJAKGu1p8ZX0ClMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN
AQEFBQADgYEAL9baSkA4jw+FL5Aq7xDR7aAoDu6qKT3wRgpmSQl9vL0SatncDdio
JpfAnENN3g4M/MABt0B1qOd7r1rK+ymbmszficRyb5v0Z8n/60fIg42YHygV+wFa
wcf4VXqAQ+lCpCosqgi30XDJXNECMx1kHf7NUtNacJpxHhJ+6swqErc=
-----END CERTIFICATE-----
EOD;
}
}
//上面的 public_cert下载地址为: http://os.51.com/public.cer ,用来验证contianer给我们的信息,不同的container下载不同的public cert文件,你也可以不下载直接用网路上的文件:)
//Build a request object from the current request
$request = OAuthRequest::from_request(null, null, array_merge($_GET, $_POST));
//Initialize the new signature method
$signature_method = new FOSignatureMethod();
//Check the request signature
@$signature_valid = $signature_method->check_signature($request, null, null, $_GET["oauth_signature"]);
//上面这句代码就是去验证,是否我们想要的CONTAINER发送过来的信息:)
//Build the output object
$payload = array();
if ($signature_valid == true) { //这里是TRUE,说明验证成功了。
$payload["validated"] = "Success! The data was validated";
} else { // 失败:(,那我们就不叫他继续运行我们的程序了,屏蔽
$payload["validated"] = "This request was spoofed";
}
//Add extra parameters to help debugging
$payload["get"] = $_GET;
$payload["post"] = $_POST;
$payload["rawpost"] = file_get_contents("php://input");
//Return the response as JSON
echo var_export($payload);
?>
</code>
这里我们在js端发送一个验证过的请求,到我们(应用本身)的SERVER端验证请求的正确性,就完成了。
本代码版权吴伊自所有,我这里纯属抄袭:)