# 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