思刻通行证
由清北科技、IURT、思刻协会共同开发的 OAuth SSO 平台。
1/ 申请 API
参考接口鉴权,申请通行证应用,设置完毕后可获得:
- api_id:类似于公钥,应用 ID,用于区分不同应用;
- api_key:类似于私钥,用于服务端在收到回调后与通行证服务器通信。
在调用时需按说明传入需要的 API 参数。
2/ 接入
2.1/ 接入方式
本通行证支持两种使用方式:
- 完全嵌入:如果使用的网站程序支持(例如:IURT 官网,可以使用通行证作为唯一的登录方式;
- 插件嵌入:如果网站程序自带用户系统(例如:清北博客,可以对接通行证 API,允许绑定现有的账号,此时应该以用户数据中的
email
字段识别和绑定用户。如果你使用 Typecho,可以使用我们开发的插件:SckurPassport。
2.2/ 登录页面
在页面中使用:
<a href="https://passport.sckur.com/login.php?callback=YOUR_CALLBACK&api_id=YOUR_API_ID">
<img style="height:30px" src="https://passport.sckur.com/static/images/login.png" alt="使用思刻通行证登录">
</a>
<a href="https://passport.sckur.com/login.php?callback=YOUR_CALLBACK&api_id=YOUR_API_ID">
<img style="height:30px" src="https://passport.sckur.com/static/images/login.png" alt="使用思刻通行证登录">
</a>
回调地址需要包含http://
或https://
。
示例:
图片大小可自行调整,注意替换回调地址和 API ID,例如使用 PHP 输出网页:
<?php
// 配置通行证公钥和回调地址
$callback = "https://callback.com";
$app_id = "xxxxxx";
// 输出原生账号登录表单
outputLoginPage();
// 输出第三方登录按钮
echo '<p>•或使用•</p>';
echo '<a href="https://passport.sckur.com/login.php?callback='.$callback.'&api_id='.$app_id.'"><img style="height:50px" src="https://passport.sckur.com/static/images/login.png" alt="使用思刻通行证登录"></a>';
<?php
// 配置通行证公钥和回调地址
$callback = "https://callback.com";
$app_id = "xxxxxx";
// 输出原生账号登录表单
outputLoginPage();
// 输出第三方登录按钮
echo '<p>•或使用•</p>';
echo '<a href="https://passport.sckur.com/login.php?callback='.$callback.'&api_id='.$app_id.'"><img style="height:50px" src="https://passport.sckur.com/static/images/login.png" alt="使用思刻通行证登录"></a>';
2.3/ 登录回调
用户登录成功跳转到回调地址后,回调地址会收到 GET 参数refresh_token
。
refresh_token
可作为该唯一识别码,是获取该用户数据的凭证,过期时间五分钟。
收到回调后,使用api_key
和refresh_token
向 API 接口地址:
https://passport.sckur.com/api/
https://passport.sckur.com/api/
发起 GET/POST 请求获取数据。
PHP 代码示例:
<?php
function loginCallback($status, $response) {
if ($status) {
// 处理登录成功
}
else {
// 处理登录失败
}
}
// 应用私钥
$api_key = 'yyyyyyy';
// 回调 Token
$refresh_token = $_GET['refresh_token'];
// API 操作名称
// 参考下文中操作类型的说明
$action = 'get-maininfo';
// API 接口地址
$url = 'https://passport.sckur.com/api/'.$action.'/?site_key='.$api_key.'&user_key='.$refresh_token;
// 发起请求
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($curl);
// 判断状态
if ($response === FALSE) {
loginCallback(FALSE, array('msg' => curl_error($curl))); // 请求失败,返回错误信息
} elseif ($response['code'] == 200) {
loginCallback(TRUE, $response['data']); // 登录成功,返回响应数据
else {
loginCallback(FALSE, $response['msg']); // 登录失败,返回错误信息
}
// 结束请求
curl_close($curl);
<?php
function loginCallback($status, $response) {
if ($status) {
// 处理登录成功
}
else {
// 处理登录失败
}
}
// 应用私钥
$api_key = 'yyyyyyy';
// 回调 Token
$refresh_token = $_GET['refresh_token'];
// API 操作名称
// 参考下文中操作类型的说明
$action = 'get-maininfo';
// API 接口地址
$url = 'https://passport.sckur.com/api/'.$action.'/?site_key='.$api_key.'&user_key='.$refresh_token;
// 发起请求
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($curl);
// 判断状态
if ($response === FALSE) {
loginCallback(FALSE, array('msg' => curl_error($curl))); // 请求失败,返回错误信息
} elseif ($response['code'] == 200) {
loginCallback(TRUE, $response['data']); // 登录成功,返回响应数据
else {
loginCallback(FALSE, $response['msg']); // 登录失败,返回错误信息
}
// 结束请求
curl_close($curl);
操作类型:
- get-maininfo:获取 JSON 格式的用户主要数据,返回数据说明:
字段名 | 说明 | 示例 |
---|---|---|
status | 请求执行的状态 | successful |
id | 用户id | 1 |
username | 用户名 | admin |
nickname | 用户昵称 | Administrator |
用户邮箱 | [email protected] | |
phonenumber | 用户手机号 | +86.18888888888 |
head_picture | 用户头像 | https://gravatar.com/xxx |
WARNING
并不是所有应用在获取信息时都能获取所有信息,申请应用时需要勾选所需信息,在获取信息时只会返回这些授权获取的信息,因此需要进行逻辑判断,否则可能会出现获取到null
或undefined
等数据。
- get-otherinfo:获取 JSON 格式的用户其他数据。字段值全部使用 Base64 编码,因此获取后需要自行接码。返回数据说明(示例已 Base64 解码):
字段名 | 说明 | 示例 |
---|---|---|
introduce | 个人介绍 | 思刻协会创始人 |
level | 思刻协会等级 | 114514 |
invitation-code | 邀请码 | null |
inbound-time | 加入时间 | 2023-01-01 |
goal | 目标 | 发展协会 |
label | 标签 | IURT,数学,Wikist,思刻协会 |
age | 年龄 | 18 |
location | 地址 | China |
gender | 性别 | male |
birthday | 生日 | 2022-01-01 |
certify | 认证 | 思刻协会官方认证 |
hobby | 爱好 | 计算机科学 |
institution | 教育经历 | 清华大学 本科 |
employment | 职业 | 学生 |
website | 网站 | https://www.sckur.com |
Facebook 账号 | @Sckur | |
Twitter 账号 | @Sckur | |
dribbble | Dribbble 账号 | @Sckur |
WhatsApp 账号 | @Sckur | |
Instagram 账号 | @Sckur | |
QQ 号 | 0000000 | |
微信号 | sckur | |
telegram | Telegram 账号 | @Sckur |
github | GitHub 账号 | @Sckur |
Google 账号 | [email protected] | |
youtube | YouTube 账号 | @Sckur |
TIP
如果 Base64 解码时出现乱码,可以使用以下示例代码(以 PHP 为例):
base64_decode(str_replace(' ','+',$response));
base64_decode(str_replace(' ','+',$response));
get-oneinfo:获取 JSON 格式的单个信息,使用
fieldname
参数传入需要的信息字段。返回格式和编码同上。update-oneinfo:更新某个信息,使用
fieldname
参数传入字段名和text
参数传入字段值。暂不支持批量修改,如有需要应按顺序依次修改。
WARNING
需要对text
参数进行 Base64 编码,否则更新后解码会出现null
或空值等异常结果。本 API 需要管理员权限。
3/ 错误码
以下是已知错误:
Your API KEY does not exist!
问题原因:传入了错误的api_key
。
解决方法:检查你的输入或复制,注意不要弄混api_key
和api_id
。
Your API status is inactive!
问题原因:你的应用状态处于非活跃状态(INACTIVE
),可能由于风控被封禁,也可能因为违规使用而强制关闭。
解决方法:在应用中心申诉。
Your API has expired!
问题原因;你的应用已经过期。
解决方法:在应用中心重新申请或续期。
We do not get the website private key or the user private key or request!
问题原因:你的请求 URL 中缺少参数,如api_key
/request
,或者 Refresh Token 是无效值,找不到对应的用户。
解决方法:检查请求参数。
Only APIs with admin privileges can modify secondary user information!
问题原因:你的请求需要有管理员(admin
)权限。
解决方法:目前而言,只有和思刻协会建立合作或加盟关系的组织(例如:清北科技、IURT)才有机会申请获得管理员权限。
If there is no correct and valid request, please refer to the API documentation!
问题原因:请求不合法,可能是请求参数、请求方式等不正确。
解决方法:按照 API 文档检查调用代码。
Refresh Token is not valid or has expired or is too early!
问题原因:Refresh Token 不正确、已过期或尚未生效。
解决方法:如果用户正常登录使用遇到这个错误,请在代码逻辑中处理此情况的办法:告知用户需要重试登录以获取正确的 Refresh Token。如果你试图重放请求,也可能会遇到这个错误。
如果出现了未知错误:
没有报错,但输出
null
、false