各种应用整合 baigo SSO 都是通过 API 接口实现的,您可以在各类应用程序中使用该接口,通过发起 HTTP 请求方式调用 baigo SSO 服务,返回 JSON 数据。
本文档的所有的示例都是在 ginkgo 框架基础之上建立的,关于 ginkgo 框架的详情请查看 ginkgo 框架文档。以下为完整的调用登录接口的示例:
use ginkgo/Json;
use ginkgo/Crypt;
use ginkgo/Sign;
use ginkgo/Http;
$_time_deviation = 300; //超时范围 (秒)
$_app_id = 1; //APP ID
$_app_key = 'e10adc3949ba59abbe56e057f20f883e'; //App Key
$_app_secret = 'e10adc3949ba59ab'; //App Secret
$_arr_crypt = array(
'user_name' => 'baigo',
'user_pass' => md5('123456'),
'user_ip' => '127.0.0.1',
'timestamp' => time(),
);
$_str_crypt = Json::encode($_arr_crypt); //编码
$_arr_encrypt = Crypt::encrypt($_str_crypt, $_app_key, $_app_secret); //加密
if (isset($_arr_encrypt['error'])) { //加密出错
return $_arr_encrypt;
}
$_arr_data = array(
'app_id' => $_app_id,
'app_key' => $_app_key,
'code' => $_arr_encrypt['encrypt'],
'sign' => Sign::make($_str_crypt, $_app_key . $_app_secret),
);
$_arr_get = Http::instance()->request('http://server/index.php/api/login/login/', $_arr_data, 'post'); //请求
$_arr_decrypt = Crypt::decrypt($_arr_get['code'], $_app_key, $_app_secret); //解密
if (isset($_arr_decrypt['error'])) { //解密出错
return $_arr_decrypt;
}
if (!Sign::check($_arr_decrypt['decrypt'], $str_sign, $_app_key . $_app_secret)) {
return 'Signature is incorrect'; //签名错误
}
$_arr_return = Json::decode($_arr_decrypt['decrypt']); //解码
if (!isset($_arr_return['timestamp'])) {
return 'Timestamp out of range'; //缺少时间戳
}
if ($_arr_return['timestamp'] > GK_NOW + $_time_deviation || $_arr_return['timestamp'] < GK_NOW - $_time_deviation) {
return 'Timestamp out of range'; //超时
}
print_r($_arr_return);
baigo SSO 大部分 API 接口返回加密参数,真正内容需要解密,详情请查看具体接口。
参数名 | 描述 |
---|---|
code | 加密参数,需要解密。 |
sign | 签名 |
rcode | 返回代码 |
msg | 消息 |
prd_sso_ver | baigo SSO 版本号。 |
prd_sso_pub | baigo SSO 版本发布时间,格式为年月日。 |
返回结果示例
{
"code": "CSMEIFh7AHYBOFIlXQwAaQE0UXENawF2WUxXUQNFVD4Ac1R%2BUSUFdQgnBmYMcARb", //加密参数
"sign": "0VHBRPQUICBKGVWXTBDQBHVEPWK", //签名
"rcode": "y010102" //返回代码
"msg": "登录成功",
"prd_sso_ver": "1.1.1", //SSO 版本号
"prd_sso_pub": 20150923, //SSO 版本发布时间
}