基本有以下三种方案
1.集中管理Session. 实现很简单,但缺点是 每次页面刷新都需要访问一次或两次 Session管理服务器, 感觉代价太高,不打算使用. (Ucenter即使用这种方式)
2.统一登录. 所有登录及退出登录操作全由登录服务器 提供页面并完成. 缺点是各个应用无法个性化登录页面. 暂时不打算采用. (CAS使用这种方式)
3.同步方式 . 应用自行保存登录状态,并在登录状态改变(登录及退出登录时),同时通知登录服务器. 另外.在进行需要登录才能进行的操作时,向登录服务器获取当前登录状态. 打算按这个方式来实现. 缺点:无法即时更新登录状态.
下面只描述第三种方式的实现过程.
一.以下四种情况,应用需要与登录服务器交互
1.用户在应用中点击登录按钮时,向登录服务器获取登录状态
2.用户在应用中登录后.更新登录服务器状态
3.用户在应用中退出登录后,更新登录服务器状态
4.用户在应用中进行购买/发言等操作时,先向登录服务器获取登录状态
二.交互方式
1.使用URL Redirect方式跳转到登录服务器指定地址
2.同时提供回调地址(也可在登录服务器上预设),登录服务器处理完成后,同样使用Url Redirect跳转回应用进行后继处理.
三.登录服务器
1.要用Session保存每个用户的登录状态,这导致所有应用的Session过期时间统一.
2.提供两个跳转方式的接口,分别用于处理 更新及获取登录状态
3.提供一系列接口 用于保存用户信息及获取用户信息,具体略
API功能列表
| 功能 | 同步/异步 | Action |
1 | 注册 | 同步 | Register |
2 | 删除用户 | 同步 | Release |
3 | 登录 | 同步 | Login |
4 | 退出登录 | 同步 | Logout |
5 | 修改密码 | 同步 | ChangePassword |
6 | 重置密码 | 同步 | ResetPassword |
7 | 修改用户名 | 同步 | Rename |
8 | 增加 附加信息 | 同步 | Insert |
9 | 删除 附加信息 | 同步 | Delete |
10 | 修改 附加信息 | 同步 | Update |
11 | 查询 附加信息 | 同步 | Select |
12 | 获取联合登录区域 | 同步 | UnionShow |
13 | 查看联合登录相关信息 | 同步 | UnionGet |
14 | (*)更新登录状态 | 异步 | UpdateLogin |
15 | (*)获取登录状态 | 异步 | GetLogin |
网络安全:
1.只允许内网访问,只允许固定IP访问
2.每个应用有自己的Key和Secret, Secret不在网络上传输
3.应用方发起的请求:
所有请求参数组合成数组,Json编码,使用应用方Secret进行加密
请求格式:From=<应用方的Key>&Request=<加密信息>
4.用户中心回复应用方的请求:
所有回复参数组合成数组,Json编码,使用应用方Secret进行加密
回复格式为纯文本
5.用户中心发起的请求:
所有请求参数组合成数组,Json编码,使用应用方Secret进行加密
请求格式:Request=<加密信息>
6.应用方回复用户中心的请求:
所有回复参数组合成数组,Json编码,使用应用方Secret进行加密
回复格式为纯文本
7.所有请求及回复参数中,增加一个Time参数为当前时间戳.
接收方检查时间戳与当前时间的间隔
缺少此参数,丢弃此请求
超出10秒,丢弃此请求
8.请求或回复中缺少相应参数,则放弃本次通讯
如无法解密,同样放弃本次通讯
所有返回参数格式
1.Status:Error/Success
2.ErrorMessage:错误信息(UTF-8)
3.ErrorCode:错误编码
4.其它成功参数
错误编码 | 错误消息 |
1 | 用户名(Name)不允许特殊字符 |
2 | 用户名(Name)已经被使用 |
3 | 用户不存在 |
4 | 用户名(Name)不匹配 |
5 | 密码(Password)错误 |
6 | 禁止登录 |
7 | 附加信息(Key)已经存在 |
8 | 附加信息(Key)不存在 |
|
|
1.注册
参数 | Name 用户名 Password 密码 如果有其它参数,作为 文本附加信息处理 |
|
失败返回 error | 1.用户名(Name)不允许特殊字符 2.用户名(Name)已经被使用 |
|
成功返回 success | Id:用户唯一编号 |
|
2.删除用户
参数 | Id 用户编号 Name 用户名 |
|
失败返回 error | 3.用户不存在 4.用户名(Name)不匹配 |
|
成功返回 success |
|
|
技术细节 | 伪删除 |
|
3.登录
参数 | Name 用户名 Password 密码 |
|
失败返回 error | 3.用户不存在 5.密码错误 6.禁止登录 |
|
成功返回 success | Id:用户唯一编号 |
|
技术细节 | 此接口并不同步登录,只是检查是否允许登录 |
|
4.退出登录
参数 | Id 用户编号 |
|
失败返回 error | 3.用户不存在
|
|
成功 success |
|
|
技术细节 | 此接口并不同步登录状态,只是检查参数合法性 |
|
5.修改密码
参数 | Id 用户编号 Password 密码 New 新密码 |
|
失败返回 Error | 3.用户不存在 5.密码错误 |
|
成功 success |
|
|
6.重置密码
参数 | Id 用户编号 |
|
失败返回 | 3.用户不存在 |
|
成功返回 | Password 新密码 |
|
技术细节 | 随机生成一个8位数字字母串 |
|
7.修改用户名
参数 | Id 用户编号 Name 新用户名 |
|
失败返回 Error | 1.用户名不能包含特殊字符 2.用户名已经被使用 3.用户不存在 |
|
成功 Success |
|
|
技术细节 | 用户名要唯一 |
|
8.增加附加信息
参数 | Id 用户编号 Key 附加信息的名称 Value 附加信息的值 ValueType (Text/File) 文本/文件 |
|
失败返回 | 3.用户不存在 7.附加信息(Key)已经存在 |
|
成功返回 |
|
|
技术细节 | 同一用户的附加信息名称要求唯一 |
|
9.删除附加信息
参数 | Id 用户编号 Key 附加信息的名称 |
|
失败返回 | 3.用户不存在 8.附加信息(Key)不存在 |
|
成功返回 |
|
|
10.修改附加信息
参数 | Id 用户编号 Key 附加信息的名称 Value 附加信息的值 ValueType Text/File |
|
失败返回 | 3.用户不存在 8.附加信息(Key)不存在 |
|
成功返回 |
|
|
11.查询附加信息
参数 | Id 用户编号 Key 附加信息的名称 |
|
失败返回 | 3.用户不存在 8.附加信息(Key)不存在 |
|
成功返回 | Value 附加信息的值 |
|
12.获取联合登录区域
参数 | Redirect 登录后的跳转地址 |
|
失败返回 |
|
|
成功返回 | Html 视图代码 |
|
技术细节 |
|
|
13.获取联合登录相关信息
参数 | Id 用户编号 |
|
失败返回 | 3.用户不存在 |
|
成功返回 | Info:Array( array( '<合作方>', '<合作方编号>' ), ... ) | 合作方: 百度 新浪微博 腾讯微博 360 800 支付宝 |
|
|
|
14.(*)更新登录状态
参数 | Id 用户编号 Redirect 完成后的跳转地址 |
|
失败返回 |
|
|
成功返回 |
|
|
15.(*)获取登录状态
参数 | Redirect 完成后的跳转地址 |
|
失败返回 |
|
|
成功返回 | Id 用户编号 |
|
表结构
User 用户表
Id | 用户编号 | 主键 |
Name | 用户名 | 唯一 |
Password | 密码 | MD5之后 |
Created | 创建时间 | 时间戳 |
Updated | 最后登录时间 | 时间戳 |
IP | 最后登录IP |
|
Times | 总登录次数 |
|
Deleted | 是否已删除 | 否/是 |
用户附加信息表
User_Info
Id |
| 主键 |
UserId | 用户编号 | 外键 |
Key | 附加信息名称 | 与UserId一起唯一 |
Value | 附加信息的值 |
|
ValueType | 附加信息类型 |
|
Created |
|
|
Updated |
|
|
User_Union 联合登录信息
Id |
| 主键 |
UserId | 用户编号 | 外键 |
UnionName | 联合登录方名称 | 百度 新浪微博 腾讯微博 360 800 支付宝 |
UnionValue | 联合登录信息值 |
|
Created |
|
|
实现细节,单独联系我.