用户鉴权中心建设草稿
云用户登录安全信息表
设计原则:为使用平台的每个用户建立一个安全登录信息表。
简称:USLI(User security login information)
用户基础信息
名称 |
字段名/元素名 |
可查询 |
注解 |
版本 |
version |
||
用户编码 |
userId |
是 |
|
用户名称 |
userName |
否 |
|
性别 |
gender |
否 |
|
昵称 |
nickName |
否 |
|
照片 |
photo |
否 |
|
验证–手机号 |
validate-MobilePhone |
是 |
|
验证–邮件地址 |
validate-Email |
是 |
|
验证–人脸 |
validate-Face |
保留 |
|
验证–指纹 |
validate- fingerprint |
保留 |
|
最近登录时间 |
lastLoginTime |
否 |
|
创建时间 |
createTime |
否 |
|
密码 |
passWord |
否 |
1、不低于8位,至少含一个大写字符和一个小写字符 2、私钥加密 |
XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<!–用户基础信息–>
<userBaseInformation>
<id value="123"/>
<meta>
<versionId value="1"/>
<lastUpdated value="2012-8-8 23:59:59Z"/>
</meta>
<version value="1000"/>
<!–0..*–>
<useName>
<!–usual | official | temp | nickname | anonymous | old | maiden–>
<!–bind: http://www.cnfhir.com/vs/nameUse–>
<use value="official"/>
<text value="王五"/>
<family value="王"/>
<given value="五"/>
</useName>
<!–生理性别代码表(GB/T 2261.1-2003)–>
<!–urn:oid:2.16.156.10011.2.3.3.4–>
<!–0:未知的性别1:男性2:女性9:未说明的性别–>
<gender>
<system value="http://www.cnfhir.com/vs/gender"/>
<code value="1"/>
<display value="男性"/>
</gender>
<identifier>
<!– 身份证号命名空间(卫生系统的OID) –>
<system value="urn:oid:2.16.156.10011.1.3"/>
<!– 身份证号 –>
<value value="530801197603062217"/>
</identifier>
<photo value="Base64"/>
<validate>
<mobilePhone value="138******"/>
<Email value="123@qq.com"/>
</validate>
<createTime value="2012-8-8 23:59:59"/>
<language>
<coding>
<system value="urn:ietf:bcp:47"/>
<code value="zh-CN"/>
<display value="Chinese(China)"/>
</coding>
</language>
</userBaseInformation>
数据库信息
基础信息库表: UserInfo
字段名 |
类型 |
注解 |
userId |
String(18) |
用户编码+版本号(主键) |
versionId |
String(10) |
数据实例版本号 |
struVer |
String(10) |
用户信息数据模版本 |
encryptionUserData |
Text |
加密用户数据 |
useState |
int |
使用状态 1:正在使用 0:历史 |
createdTime |
datetime |
建立时间 |
登录校验表:UserValidate
字段名 |
类型 |
注解 |
userId |
String(18) |
用户编码(主键) |
passWordHash |
String(20) |
密码哈希 |
passWordRetryTimes |
int |
密码重试次数 |
mobilePhoneMask |
String(20) |
手机号伪码 显示为"138*******1" |
mobilePhoneHash |
String |
真实手机号哈希值 |
EmailMask |
String(50) |
邮件地址伪码 5****@qq.com |
EmailHash |
String |
真实邮件地址哈希值 |
Status |
String(1) |
0:锁定 1:正常 |
lastLoginTime |
Datetime |
最近登录时间 |
createTime |
Datetime |
建立时间 |
Code |
String(100) |
code |
Code_genernate_time |
Datetime |
Code 码产生时间 |
Code_ expires_in |
int |
code超时(S) |
access_token |
String(100) |
access_token |
accessToken_generate_time |
Datetime |
Accesstoken产生时间 |
access_token expires_in |
Int |
access_token过期(S) |
refresh_token |
String(100) |
refresh_token |
规则:
用户信息表采用数字证书加密存储,数据库中不明文保存敏感信息(采用伪码和哈希值配对鉴别),敏感信息包括:手机号、邮箱地址、密码。系统中不保存明文用户密码信息。
1、密码错3次,需要等待10分钟再试。
2、密码错6次,账户锁定。需要进行验证解锁。
3、用户名丢失者,可以通过手机号或者邮件验证,同时必须修改新的密码
Oauth2授权APP登录表
表名:Oauth2_PermitClientApp
字段名 |
类型 |
说明 |
userId |
String |
|
clientUrl |
String |
https://192.168.1.23:8001/?app=123
|
createTime |
||
URL:访问参数
参数类别
参数名 |
说明 |
|
第一步:客户端请求访问某应用APP(123)资源
http:// localhost:8000/xxx?appid=123&*****
服务端发现没有参数appAccessCode,服务端就会自动转向登录界面:
https:// localhost:8090/oauth/login.html? redirect_uri=
http:// localhost:8000/xxx?appid=123&*****
注意这里的redirect_uri需要转换字符,不能包含?和&
第二步:客户端进入登录界面,输入用户名和密码提交,产生随机数state。要求服务器产生临时code。
https://localhost:8090/oauth/authorize?response_type=code&scope=read write&client_id=123&redirect_uri=
http:// localhost:8000/xxx?appid=123&*****&state=09876999
服务端解析,校验用户名和密码,产生Code返回,记录state
服务端自动转向到App服务端:
http:// localhost:8000/xxx?appid=123&*****&login?code=bca654ab6133ab3cbc55bb751da93b1c&state=09876999
第三步:APP服务端使用code和state与oauth服务器交换accessCode
localhost:8090/oauth/token?client_id=test&client_secret=test&grant_type=authorization_code&code=bca654ab6133ab3cbc55bb751da93b1c&redirect_uri= localhost:8000/xxx?appid=123&*****&scope=read write&state=09876999
oauth服务器收到请求,回复APP服务端。
{
"access_token": "23e003b5e4b9b7eda228b845532d8336",
"refresh_token": "d6b49710f398c405a62f31a6676c5830",
"token_type": "Bearer",
"expires_in": 43199
}
第四步:App服务器获得access_token,用acess_token 访问oauth服务中的用户信息
localhost:8090/oauth/userinfo?access_code=23e003b5e4b9b7eda228b845532d8336
返回用户信息
userBaseInformation信息(xml或者json)
此处省略……..
第五步:App服务器建立一个登陆用户信息表,同时生成app_access_code(用户访问App授权码)
userId:
access_code:
login_time
refresh_token:
app_access_code:
expires_in:
发出转向:
http:// localhost:8000/xxx?appid=123&*****&userid=123&app_access_code=xxx
在access_token过期后,重新想oauth服务申请新的access_code:
http://localhost:8090/oauth/token?grant_type=refresh_token&refresh_token=ad3941d1-c6dd-4a2e-a9c8-eac6a9a59dd2
结束:
资源路径及名称关键字
系统 |
关键词名称 |
说明 |
Oauth |
oauth/token |
|
Oauth |
oauth/login.html |
|
Oauth |
oauth/authorize |
|
Oauth |
oauth/userinfo |
URL参数关键词表
系统 |
关键词名称 |
说明 |
Oauth |
Code |
不区分大小写 |
Oauth |
appAccessCode |
|
Oauth |
login |
|
Oauth |
redirect_uri |
|
Oauth |
appid |
|
Oauth |
scope |
|
Oauth |
state |
|
Oauth |
response_type |
|
Oauth |
grant_type |