## 第一步:引导用户到认证服务器(授权登录)
在登录界面,引导用户选择商城第三方授权登录,用户点击后跳转到商城授权页面。授权页面地址获取方法如下:
#### url地址
>**{host}/oauth2/authorize?response_type=code&client_id=YOUR_API_ID&redirect_uri=REDIRECT_URL&state=NONCESTR**
#### url参数
* `response_type`:表示响应类型,必选项,此处的值固定为code
* `client_id`:表示客户端的ID,即签约成功后获得的API Key,用来标志授权请求的来源,必选项
* `redirect_uri`:授权后重定向的回调链接地址,请使用urlencode对链接进行处理
* `state`:表示客户端的当前状态,认证服务器会原封不动地返回这个值 ,用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验。
#### 例子
[https://api_test.employeechoice.cn/v1/oauth2/authorize?response_type=code&client_id=100001&redirect_uri=https%3a%2f%2fwww.baidu.com%2f&state=bb38108d1aaf567c72da0f1167e87142d0e20cb2bb24ec5a](https://api_test.employeechoice.cn/v1/oauth2/authorize?response_type=code&client_id=100001&redirect_uri=https%3a%2f%2fwww.baidu.com%2f&state=bb38108d1aaf567c72da0f1167e87142d0e20cb2bb24ec5a)
<br>
## 第二步:用户同意为第三方应用授权(获取Authorization Code)
这一步,对于用户来说,同意授权即可。对于开发者来说,就是获取code。用户授权并登录后,授权服务器首先会post一个请求回服务器进行用户认证,认证通过后授权服务器会生成一个授权码,然后认证服务器会回调redirect_uri,并返回授权码code和授权请求中传递的state
#### 回调实例
[http://www.baidu.com?code=093B9307E38DC5A2C3AD147B150F2AB3&state=bb38108d1aaf567c72da0f1167e87142d0e20cb2bb24ec5a](http://www.baidu.com?code=093B9307E38DC5A2C3AD147B150F2AB3&state=bb38108d1aaf567c72da0f1167e87142d0e20cb2bb24ec5a)
注意:`093B9307E38DC5A2C3AD147B150F2AB3` 就是返回的授权码。请务必快速执行此操作,因为授权代码会在30秒后到期,且只能使用一次!
<br>
<br>
## 第三步: 使用授权码向认证服务器申请令牌(获取access_token)
开发者拿到认证服务器返回的授权码(Authorization Code)后,需要根据授权码再次向认证服务器申请令牌(access_token)
~~~[api]
post:https://api_test.employeechoice.cn/v1/oauth2/accessToken
*string:client_id=#表示客户端的ID,即签约成功后获得的API Key,用来标志授权请求的来源
*string:client_secret#认证密钥,签约成功后获取的API Secret,机密信息十分重要
*string:redirect_uri#授权时传的回调地址,必须和第一步保持一致,主要验证来源
*string:grant_type=authorization_code#授权类型,此处的值固定为authorization_code
*string:code#授权码
<<<
success
{
"access_token": "fe7c425d163ba7739a710b1fe0f63184bc8cf703",
"expires_in": 3600,
"token_type": "Bearer",
"scope": null,
"refresh_token": "c4ead4fb10f663d7df0087a36b892b9576fd3daf"// 刷新用的token
}
<<<
error
{
"error": "invalid_grant", // 错误代码
"error_description": "Authorization code doesn't exist or is invalid for the client" // 错误信息
}
~~~
<br>
<br>
## 第四步:向资源服务器申请资源(获取开放数据)
到这一步OAuth2.0的流程可以说是结束了,但是对于开发者来说还有重要的事情要做。那就是:
**拿到token、openid和用户信息这么重要数据保到自己数据库,实现自己的业务逻辑**
有了token,再向资源服务器提供的资源接口发送请求,资源服务器校验令牌无误后,就会返回开放接口数据。
#### 1. 获取平台openid
~~~[api]
get:https://api_test.employeechoice.cn/v1/oauth2/getOpenId?access_token=fe7c425d163ba7739a710b1fe0f63184bc8cf703
*string:access_token#令牌
<<<
success
{
"status": 1,
"msg": "操作成功!",
"result": {
"access_token": "eef4b2de110b205a85ba7ef3d941f2eeef0aea58",
"client_id": "100001",
"expires": 1536083506,
"scope": null,
"open_id": "619ebba6722756fdcb2654068df5ee4c"
}
}
<<<
error
{
"error": "invalid_token",
"error_description": "The access token provided is invalid"
}
~~~
#### 2. 获取用户信息
~~~[api]
get:https://api_test.employeechoice.cn/v1/oauth2/getUserInfo?access_token=fe7c425d163ba7739a710b1fe0f63184bc8cf703
*string:access_token#令牌
<<<
success
{
"status": 1,
"msg": "操作成功!",
"result": {
"seller_name": "倍升互联(北京)科技有限公司",
}
}
<<<
error
{
"error": "invalid_token",
"error_description": "The access token provided is invalid"
}
~~~
<br>
## 第五步:令牌延期(刷新)
为了安全性考虑,返回的`access_token`是有时间限制的,上面返回的令牌有效期为10小时,access_token失效时,需要重新向认证平台申请授权。
#### 用例
* 允许客户长时间访问用户的资源
* 检索具有相同或较小范围的其他标记以进行单独的资源调用
~~~[api]
post:https://api_test.employeechoice.cn/v1/oauth2/refreshToken
*string:client_id#表示客户端的ID,即签约成功后获得的API Key,用来标志授权请求的来源
*string:client_secret#认证密钥,签约成功后获取的API Secret,机密信息十分重要
*string:grant_type=refresh_token#授权类型,refresh_token
*string:refresh_token#刷新令牌
<<<
success
{
"access_token": "fe7c425d163ba7739a710b1fe0f63184bc8cf703",
"expires_in": 3600,
"token_type": "Bearer",
"scope": null,
"refresh_token": "c4ead4fb10f663d7df0087a36b892b9576fd3daf"// 刷新用的token
}
<<<
error
{
"error": "invalid_grant", // 错误代码
"error_description": "Authorization code doesn't exist or is invalid for the client" // 错误信息
}
~~~