OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。
OAuth2.0:对于用户相关的OpenAPI(例如获取用户信息,动态同步,照片,日志,分享等),为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。
Ci互联:基于OAuth2.0,服务于开发者,让开发应用更加简单,不同应用对接更加容易。
Ci互联Api(OAuth2.0)目录流程更新时间特殊授权【需申请】API请求1.获取 code2.通过code换取OpenID3.通过OpenID换取用户认证3.通过OpenID换取GroupID“组”概念【开发中】4.通过OpenID换取CiID(全平台统一ID)【开发中】业务场景(可以做什么)1.快捷对接登录注册系统2.快捷实名认证/手机号认证【开发中】3.同开发者A应用 和 B应用 账号数据互通4.多个开发者的不同应用单独打通互联。“组“ 概念【开发中】SDKWEBPHP
登录OAuth2.0总体处理流程如下:
Step1:申请接入,获取appid和apikey; Step2:开发应用,并设置协作者帐号进行测试联调; Step3:登录按钮; Step4:通过用户登录验证和授权,获取OpenID; Step6:调用OpenAPI,来请求访问或修改用户授权的资源。
2020-9-9
1. 更新文档说明
2020-9-4
1. 重置密码/认证 更新
2020-9-3
1. 正式上线
微信扫码添加微信,联系官方人员申请。
参数 | 说明 | 方式 |
---|---|---|
get_user_info | 获取登录用户的昵称、头像、性别 | code换取 |
get_mobile | 可以获取到用户手机号 | code换取 |
get_user | 你可以通知注册账号和修改密码 | OpenID换取 |
get_silence | 静默跳转,不需要用户授权(如用户已登录) | 单独申请 |
get_auth | 可以获取到获得用户的真实姓名 | OpenID换取 |
前往官网注册账号
https://oauth.acgice.com/
实名认证后,添加应用,应用通过审核后即可正常调用API
请求地址:
xxxxxxxxxx
https://oauth.acgice.com/oauth/getcode
请求方法:
GET
请求参数: 请求参数请包含如下内容:
参数 | 是否必须 | 含义 |
---|---|---|
appid | 必须 | 分配给应用的appid。 |
redirect_uri | 必须 | 成功授权后的回调地址,必须是注册appid时填写的主域名下的地址,建议设置为网站首页或网站的用户中心。注意需要将url进行URLEncode。 |
state | 必须 | 用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。 |
返回说明:
例如
请求
xxxxxxxxxx
https://oauth.acgice.com/oauth/getcode?appid=1&redirect_uri=http://127.0.1.58&state=s
之后会 302跳转回 redirect_uri 获取code
xxxxxxxxxx
http://127.0.1.58/?state=s&error=0&code=fasfasbh425
失败的话会跳转
xxxxxxxxxx
http://127.0.1.58/?state=&error=1&value=state参数不能为空
请求地址:
xxxxxxxxxx
https://oauth.acgice.com/oauth/openid
请求方法:
POST
请求参数:
请求参数请包含如下内容:
参数 | 是否必须 | 含义 |
---|---|---|
appid | 必须 | 申请QQ登录成功后,分配给网站的appid。 |
appkey | 必须 | 申请QQ登录成功后,分配给网站的appkey。 |
code | 必须 | 10分钟内有效,仅可使用一次。 |
state | 必须 | 用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。 |
返回说明:
如果成功返回,即可在返回的JSON中获取到各种信息。
参数说明 | 描述 |
---|---|
openid | 该应用账号的唯一标识 |
unionid | 同开发者旗下不同应用的唯一标识 |
nickname | 用户昵称 |
sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
headimgurl | 用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 |
mobile | 用户的手机号,如未授权则不展现。 |
state | 用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。 |
如果失败
xxxxxxxxxx
{"error":"1","value":"appid不能为空"}
当通过code换取OpenID时,OpenID会在30天后无法使用
重新通过code换取OpenID时,OpenID会自动续期30天
注意! 并不是说OpenID会变动消失!而是无法请求使用OpenID的API
请求地址:
x暂无
请求方法:
POST
请求参数:
请求参数请包含如下内容:
参数 | 是否必须 | 含义 |
---|---|---|
appid | 必须 | 申请QQ登录成功后,分配给网站的appid。 |
appkey | 必须 | 申请QQ登录成功后,分配给网站的appkey。 |
openid | 必须 | 该应用会员的唯一标识 |
state | 必须 | 用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。 |
返回说明:
如果成功返回,即可在返回的JSON中获取到数据。
参数说明 | 描述 |
---|---|
openid | 该应用账号的唯一标识 |
unionid | 同开发者旗下不同应用的唯一标识 |
fid | 该用户的身份证号 |
fname | 该用户的真实姓名 |
state | 用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。 |
如果失败
xxxxxxxxxx
{"error":"1","value":"appid不能为空"}
当通过code换取OpenID时,OpenID会在30天后无法使用
重新通过code换取OpenID时,OpenID会自动续期30天
注意! 并不是说OpenID会变动消失!而是无法请求使用OpenID的API
请求地址:
x暂无
请求方法:
POST
请求参数:
请求参数请包含如下内容:
参数 | 是否必须 | 含义 |
---|---|---|
appid | 必须 | 申请QQ登录成功后,分配给网站的appid。 |
appkey | 必须 | 申请QQ登录成功后,分配给网站的appkey。 |
openid | 必须 | 该应用账号的唯一标识 |
gid | 必须 | 组ID,请在应用后台查询 |
state | 必须 | 用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。 |
返回说明:
如果成功返回,即可在返回的JSON中获取到返回数据。
参数说明 | 描述 |
---|---|
openid | 该应用账号的唯一标识 |
unionid | 同开发者旗下不同应用的唯一标识 |
state | 用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。 |
groupid | 用户组的唯一groupid |
如果失败
xxxxxxxxxx
{"error":"1","value":"appid不能为空"}
当通过code换取OpenID时,OpenID会在30天后无法使用
重新通过code换取OpenID时,OpenID会自动续期30天
注意! 并不是说OpenID会变动消失!而是无法请求使用OpenID的API
请求地址:
x暂无
请求方法:
POST
请求参数:
请求参数请包含如下内容:
参数 | 是否必须 | 含义 |
---|---|---|
appid | 必须 | 申请QQ登录成功后,分配给网站的appid。 |
appkey | 必须 | 申请QQ登录成功后,分配给网站的appkey。 |
openid | 必须 | 该应用账号的唯一标识 |
gid | 必须 | 组ID,请在应用后台查询 |
state | 必须 | 用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。 |
返回说明:
如果成功返回,即可在返回的JSON中获取到返回数据。
参数说明 | 描述 |
---|---|
openid | 该应用账号的唯一标识 |
unionid | 同开发者旗下不同应用的唯一标识 |
state | 用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。 |
ciid | Ci互联全平台统一ID |
如果失败
xxxxxxxxxx
{"error":"1","value":"appid不能为空"}
提供几个开发思路。
免除自己开发 登录,注册,找回密码,手机号验证的成本,只需要沉浸与开发核心业务身上。
授权后会返回用户真实的认证信息以及手机号,可以直接免费获取。
同开发者下 所有应用授权 同一个用户的 unionid 是一模一样的。
使用 unionid 判断用户是否注册 或者 2个应用之前请求传递用户的 unionid 。
A开发者的 A1应用 A2应用
B开发者的 B1应用 B2应用
如果 A B 开发者想要将 A1 和 B2 的用户数据打通,平常来说是基本不可能的事情。
这时候 “组” 的概念就出来了, 我A1 和 B1单独打通, A1 和 B2 单独打通 ( 互不影响且数据不一样 )
程序的演示
xxxxxxxxxx
<?php
define("API", "https://oauth.acgice.com/");
define("AppID", "您的APPID");
define("AppKEY", "您的AppKEY");
define("State", "login");//防攻击安全参数
$redirect_uri = "http://192.168.19.219/sdk/";//回调地址
$code = GetCode();
if($code == "0"){
SetCode();
return;
}elseif($code == "1"){
echo "code 获取错误:".$_GET["value"];
return;
}
$openid = GetOpenID($code);
if(!isset($openid["error"])){
echo "获取失败";
return;
}
if($openid["error"] == "1"){
echo "错误:".$openid["value"];
return;
}
if($openid["state"] !== State){
echo "参数不正确";
return;
}
print_r($openid);
exit;
// 最终返回
// Array
// (
// [state] => login
// [openid] => Mixm11111ZjODFl
// [unionid] => dW511111Dk4MGY=
// [mobile] => 13333333333
// [nickname] => 测试账号
// [sex] => 1
// [headurl] => https://www.com/1.jpg
// )
function GetOpenID($code){
$options = [
API."/oauth/openid",
'?appid=' . AppID,
'&appkey=' . AppKEY,
'&code='.$code,
'&state=' . State
];
$openid = http_query(implode('', $options));
$data = json_decode($openid,true);
return $data;
}
function GetCode(){
if (isset($_GET["error"]) && isset($_GET["state"])) {
if($_GET["error"] !== "0"){
//错误
return "1";
}
if($_GET["state"] !== State){
//错误
return "1";
}
//成功
if (isset($_GET["code"])) {
return $_GET["code"];
}
return "1";
}
return "0";
}
function SetCode(){
$options = [
API."/oauth/getcode",
'?appid=' . AppID,
'&redirect_uri=' . urlencode($redirect_uri),
'&state=' . State
];
header('Location: ' . implode('', $options));
}
function http_query($url, $post = null)
{
// 初始化一个cURL会话
$ch = curl_init($url);
if (isset($post)) {
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
//忽略证书
if (substr($url, 0, 5) == 'https') {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
}
$curl_result = curl_exec($ch);
if ($curl_result) {
$data = $curl_result;
} else {
$data = curl_error($ch);
}
curl_close($ch); #关闭cURL会话
return $data;
}