## 同步登录接口
本接口使得用户在一点登录以后,在所有网站同时登录或者登出,要全面实现这一功能,需要此接口与“同步登录通知”配合才能实现,关于同步登录通知请查看 [通知 -> 同步登录通知](../notify/sync.md)。
同步登录接口流程:
1. 用户登录应用;
2. 当前应用调用同步登录接口;
3. 当前应用通过同步登录接口得到所有开启同步登录的应用的“同步登录通知 URL”;
4. 将得到的这些 URL 发送到客户端浏览器;
5. 由浏览器访问这些 URL;
6. 这些 URL 在接收到请求以后,做出一系列的验证,保证参数是合法的,然后将用户状态设置为已登录。
下图是同步流程示意图,本文档描述下图中蓝线和紫线部分,即流程 1-3,流程 4-6 请查看 [通知 -> 同步登录通知](../notify/sync.md):
{.img-fluid .bg-img}
----------
### 同步登录
本接口使得用户在一点登录以后,在所有网站同时登录。
##### URL
http://server/index.php/api/sync/login
##### HTTP 请求方式
POST
##### 加密参数
参数进行 JSON 编码,然后将 JSON 字符串进行加密。然后把加密的结果作为 `公共请求参数` 的 code 参数。
| 名称 | 类型 | 必需 | 描述 |
| - | - | - | - |
| user_id | int | true | |
| user_access_token | string | true | 访问口令,必须用 MD5 加密后传输。 |
| timestamp | int | true | UNIX 时间戳 |
##### 返回结果是否加密
否
| 键名 | 类型 | 描述 | 备注 |
| - | - | - | - |
| rcode | string | 返回代码 | |
| urlRows | array | 同步登录通知 URL | 系统会在“同步登录通知 URL”上附加 `m=sso&c=sync&a=login` 参数,以便接收通知的系统识别。 |
返回结果示例
``` javascript
{
"rcode": "y100401",
"urlRows": [ //通知 URL
"http://abc.com/api/api.php?m=sso&c=sync&a=login&sign=SDFDSFSDREWERWUGROE7TREIE&code=CSMEIFh7AHYBOFIlXQwAaQE0UXENawF2WUxXUbg1zASk%3D&key=tLUwyt",
"http://123.cn/api/api.php?m=sso&c=sync&a=login&&sign=SDFDSFSDREWERWUGROE7TREIE&code=CSMEIFh7AHYBOFIlXQwAaQE0UXENawF2WUxXUbg1zASk%3D&key=tLUwyt"
]
}
```
----------
### 同步登出
本接口使得用户在一点登出以后,在所有网站同时登出。
##### URL
http://server/index.php/api/sync/logout
##### HTTP 请求方式
POST
##### 加密参数
参数进行 JSON 编码,然后将 JSON 字符串进行加密。然后把加密的结果作为 `公共请求参数` 的 code 参数。
| 名称 | 类型 | 必需 | 描述 |
| - | - | - | - |
| user_id | int | true | |
| user_access_token | string | true | 访问口令,必须用 MD5 加密后传输。 |
| timestamp | int | true | UNIX 时间戳 |
##### 返回结果是否加密
否
| 键名 | 类型 | 描述 | 备注 |
| - | - | - | - |
| rcode | string | 返回代码 | |
| urlRows | array | 同步登录通知 URL | 系统会在“同步登录通知 URL”上附加 `m=sso&c=sync&a=logout` 参数,以便接收通知的系统识别。 |
----------
### 调用 URL 示例
取得结果以后,开发者应该向浏览器输出调用“同步登录通知 URL”的 HTML,“同步登录通知 URL”在接收到通知以后做进一步处理。
##### AJAX + JSONP 方式
由于 AJAX 方式提交数据会涉及到跨域问题,因此 dataType 设置为 JSONP。关于 JSONP 请查看 [互动百科]((http://www.baike.com/wiki/jsonp)。AJAX 方式的优点是可以获知调用的状态,以便于判断同步是否成功,缺点是存在跨域问题,在部分浏览器可能存在兼容性问题,开发者也可尝试使用 SCRIPT 等其他方式。
``` php
```
##### SCRIPT 方式
开发者也可以根据实际情况选择 SCRIPT 方式或者 IFRAME 方式,这两种方式的优点是无跨域问题,缺点是无法获知调用的状态,无法判断同步是否成功。
``` php
$value) { ?>
```