# yzlApp **Repository Path**: nickyhb/yzlApp ## Basic Information - **Project Name**: yzlApp - **Description**: 娱助理App - **Primary Language**: PHP - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-02-27 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## UAA认证服务器单点登录接入指南 ###准备工作 UAA认证服务器是基于OAuth2.0协议标准构建的OAuth2.0授权登录系统。 在进行UAA OAuth2.0授权登录接入之前,需要先向UAA申请并获得相应的client_id和client_secret,之后才可以进行授权认证流程。 ###授权流程说明 UAA OAuth2.0授权登录让用户安全登录第三方应用或网站,在用户授权登录已接入UAA OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行UAA开放平台授权关系接口调用,从而可实现获取用户基本开放信息和帮助用户实现基础开放功能等。 UAA OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:
1. 第三方发起UAA授权登录请求,用户允许授权第三方应用后,UAA会重定向到第三方网站,并且带上授权临时票据code参数;
2. 通过code参数加上client_id和client_secret等,通过API换取access_token;
3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
###第三方请求UAA认证授权时序
+----------+ +-----------+ +------------------+
| 用户 | | 第三方 | | UAA |
| 终端 | | 服务系统 | | 授权认证服务器 |
+----------+ +-----------+ +------------------+
| 访问第三方服务 | |
|---------------------->|----+ |
| | | |
| | | 判断用户未登录 |
| |<---+ |
| | |
| | (1)重定向到UAA认证授权 |
| | url参数:client_id和redirect_uri |
| |---------------------------------->|
| | |
| |
| (2)请求用户登录确认 |
|<---------------------------------------------------------|
| |
| (3)用户登录确认 |
|--------------------------------------------------------->|
| | |
| | (4)重定向到第三方 |
| | (第一步传递的redirect_uri) |
| |<----------------------------------|
| | |
| |(5)通过code加上client_id |
| | 和client_secret |
| | 换取access_token |
| |---------------------------------->|
| | |
| | |
| | (6)返回token|refreshToken|openid |
| |<----------------------------------|
| | |
| |------+ |
| | | 根据openid确定 |
| | | 登录用户的身份 |
| | | 后续可以用token |
| | | 到uaa获取用户其他信息 |
| |<-----+ |
| | |
###第一步:请求code
第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=openid),则可以重定向PC端到以下链接:
```
http://uaa.it.cmait.top:8090/login?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE
```
+ 参数说明
参数 | 是否必须 | 说明
-------------|------------|------
client_id | 是 | 应用唯一标识
redirect_uri | 是 | 重定向地址,需要进行UrlEncode,为了安全重定向地址请使用https协议
response_type| 是 | 填code
scope | 是 | 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写openid即可
state | 否 | 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
###第二步
UAA发现用户没有登录,请求用户登录确认,这个是UAA跟用户的交互,第三方应用无需关心
###第三步
用户输入用户名&密码进行登录确认,这个是UAA跟用户的交互,第三方应用无需关心
###第四步:UAA分配临时授权票据(code)并通过redirect_uri传递给第三方应用
用户确认后,UAA分配临时授权票据code,并通过重定向的方式将code传递给第三方应用
重定向的地址为
redirect_uri?code=CODE&state=STATE
其中redirect_uri是第一步第三方应用传递过来的重定向地址, state为第一步第三方带过来的参数,如果第一步没有带该参数过来,这一步也不会有该参数
###第五步:通过code获取access_token
通过code获取access_token
```
POST http://uaa.it.cmait.top:8090/oauth2/token
```
+ 参数
```
{
"client_id": "CLIENT_ID",
"client_secret": "CLIENT_SECRET",
"code": "CODE",
"grant_type": "authorization_code",
"redirect_uri": "REDIRECT_URI"
}
```
+ 参数说明
参数 | 是否必须 | 说明
-------------|------------|------
client_id | 是 | 应用唯一标识
client_secret| 是 | 应用密钥client_secret,跟UAA申请后得到的应用秘钥
code | 是 | 填写第一步获取的code参数
grant_type | 是 | 填authorization_code
redirect_uri | 是 | 重定向地址,必须跟第一步的redirect_uri相同
+ 返回说明
正确返回 HTTP `STATUS=200`
```
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
```
参数 | 说明
--------------|------
access_token | 接口调用凭证
expires_in | access_token接口调用凭证超时时间,单位(秒)
refresh_token | 用户刷新access_token
openid | 授权用户唯一标识
scope | 用户授权的作用域,使用逗号(,)分隔
错误返回举例 HTTP `STATUS=500` 返回的格式为text,错误的具体说明
```
秘钥错误
```
###第六步:通过token获取用户信息
通过access_token获取当前用户信息
```
GET http://uaa.it.cmait.top:8090/api/user/info?access_token=ACCESS_TOKEN
```
+ 参数说明
参数 | 是否必须 | 说明
-------------|------------|------
access_token | 是 | 访问令牌
+ 返回说明
正确返回 HTTP `STATUS=200`
```
{
"openid":"OPENID",
"username":"USERNAME",
"mobile":"MOBILE",
"email":"EMAIL"
}
```
参数 | 说明
--------------|------
openid | 账户id
username | 用户名
mobile | 手机号
email | 邮箱
错误返回举例 HTTP `STATUS=500` 返回的格式为text,错误的具体说明
```
令牌过期
```
###刷新access_token有效期
access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:
1. 若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
2. 若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。
refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
```
POST http://uaa.it.cmait.top:8090/oauth2/refresh_token
```
+ 参数
```
{
"client_id": "CLIENT_ID",
"grant_type": "refresh_token",
"refresh_token": "REFRESH_TOKEN"
}
```
+ 参数说明
参数 | 是否必须 | 说明
--------------|------------|------
client_id | 是 | 应用唯一标识
grant_type | 是 | 填refresh_token
refresh_token | 是 | 填写通过access_token获取到的refresh_token参数
+ 返回说明
正确返回 HTTP `STATUS=200`
```
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
```
参数 | 说明
--------------|------
access_token | 接口调用凭证
expires_in | access_token接口调用凭证超时时间,单位(秒)
refresh_token | 用户刷新access_token
openid | 授权用户唯一标识
scope | 用户授权的作用域,使用逗号(,)分隔
错误返回举例 HTTP `STATUS=500` 返回的格式为text,错误的具体说明
```
刷新令牌错误
```
###检验授权凭证(access_token)是否有效
检验access_token是否超时失效,及与openid是否相关。
```
GET http://uaa.it.cmait.top:8090/oauth2/check_auth?access_token=ACCESS_TOKEN&openid=OPENID
```
+ 参数说明
参数 | 是否必须 | 说明
--------------|------------|------
access_token | 是 | 访问令牌
openid | 是 | 授权用户唯一标识
+ 返回说明
正确返回
```
{
"msg":"ok"
}
```
错误返回
```
{
"msg":"access_token is expired"
}
```
##手机APP对接UAA
手机app和uaa的对接有两种方式,主app登录获取token、子app获取token,目前多数情况下采用主app登录获取token的方式。
子app的方式跟第三方登录类似,子app嵌入在主app里面,在不接触用户的用户名和密码的情况下获取到用户的访问令牌
###第一步:APP获取token——主app登录获取token
主APP:由数梦工厂或者其他可信提供商开发的APP,接受用户输入用户名&密码传输到UAA,成功后获取token
```
POST http://uaa.it.cmait.top:8090/uaa/obtainToken
```
+ 参数
```
{
"username":"username",
"password":"password"
}
```
+ 参数说明
参数 | 是否必须 | 说明
---------------|------------|------
username | 是 | 登录用户名
password | 是 | 登录密码
+ 返回说明
正确返回 HTTP `STATUS=200`
```
{
"id": "ID",
"accessToken":"ACCESS_TOKEN",
"expireAt":,7200
"refreshToken":"REFRESH_TOKEN",
"refreshExpireAt":2592000,
"openId":"OPENID",
"clientId": "CLIENT_ID",
"scope": "openid",
"createdAt": "CREATE_AT",
"updatedAt": "UPDATE_AT"
}
```
参数 | 说明
--------------|------
id | 主键ID
accessToken | 根据用户名密码分配给主app的token
expireAt | accessToken超时时间,单位(秒)
refreshToken | 刷新access_token凭证
refreshExpireAt | refreshToken超时时间,单位(秒)
openId | 用户唯一标识即用户id
clientId | 应用唯一标识
scope | 用户授权的作用域,使用逗号(,)分隔
createdAt | token创建时间
updatedAt | token更新时间
错误返回举例 HTTP `STATUS=500` 返回的格式为text,错误的具体说明
```
刷新令牌错误
```
###第一步附:子app授权
子app可能是第三方开发的,不能直接拿到用户名&密码,需要使用oauth2.0协议来进行授权(子app必须有自己的后台服务器,后台服务器保存client_id和client_secret用以获取用户的访问令牌),uaa—web根据主app的token得到用户id,分配授权code,重定向第三方子app
```
GET http://uaa.it.cmait.top:8090/authorize
```
+ 参数
access_token=ACCESS_TOKEN&client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE
```
```
+ 参数说明 参数 | 是否必须 | 说明 ---------------|------------|------ client_id | 是 | 应用唯一标识 access_token | 是 | 主app的token,用来获取用户id,即open_id redirect_uri | 是 | 重定向地址 scope | 是 | 用户授权的作用域,使用逗号(,)分隔,此处填openid state | 否 | 用于保持请求和回调的状态,授权请求后原样带回给第三方 response_type | 是 | 填code + 返回说明 UAA分配临时授权票据code,并通过重定向的方式将code传递给第三方应用 重定向的地址为
redirect_uri?code=CODE&state=STATE
###关于APP其他说明
1:获取到token后,后续的操作跟网页版的无明显区别,可以根据token到uaa获取用户的信息,见上面: “通过token获取用户信息” 2:当token过期后也可以使用refresh_token进行刷新,见上面: “刷新access_token有效期”, 3:可以到uaa服务器来检查token是否过期,见上面: "检验授权凭证(access_token)是否有效"###APP特别提醒 ####当使用该token访问大应用开发的任何业务接口,如果access_token已过期或者access_token不存在,会返回http错误,http状态码是自定义的状态601,同理,当使用refresh_token刷新access_token时,如果refresh_token已过期,返回的http状态码也是自定义的601