You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
288 lines
12 KiB
288 lines
12 KiB
<html data-find="_6">
|
|
<head>
|
|
<script src="https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101"></script>
|
|
<meta charset="utf-8">
|
|
<title>应用授权</title>
|
|
<meta name="renderer" content="webkit">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
<meta name="format-detection" content="telephone=no">
|
|
|
|
<link rel="stylesheet" href="../../assets/lib/layui/css/layui.css" media="all">
|
|
<link rel="stylesheet" href="../../assets/css/global.css" media="all">
|
|
<link id="layuicss-skincodecss" rel="stylesheet" href="../../assets/lib/layui/css/modules/code.css" media="all">
|
|
<link id="layuicss-layer" rel="stylesheet" href="../../assets/lib/layui/css/modules/layer/default/layer.css?v=3.1.1"
|
|
media="all">
|
|
<style type="text/css">
|
|
.layui-table th {
|
|
white-space: nowrap !important;
|
|
}
|
|
h1 {font-size: 22px;margin-top: 20px;margin-bottom: 20px;font-weight: bold;}
|
|
.site-text p {color: rgba(0, 0, 0, .65);}
|
|
</style>
|
|
</head>
|
|
<body data-find="_5">
|
|
|
|
<div class="layui-header header header-doc" spring="">
|
|
<div class="layui-main">
|
|
<a class="logo" href="#" style="color: #ffffff">
|
|
开放平台
|
|
</a>
|
|
<ul class="layui-nav">
|
|
<li class="layui-nav-item layui-this">
|
|
<a href="doc.html">文档中心<!-- --></a>
|
|
</li>
|
|
|
|
<span class="layui-nav-bar" style="left: 162px; top: 55px; width: 0px; opacity: 0;"></span>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<!-- 让IE8/9支持媒体查询,从而兼容栅格 -->
|
|
<!--[if lt IE 9]>
|
|
<script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
|
|
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
|
|
<![endif]-->
|
|
<div class="layui-main site-inline">
|
|
<div class="site-tree">
|
|
<ul id="docItemTree" class="layui-tree">
|
|
<li><h2 class="docModule">第三方应用授权</h2></li>
|
|
<li class="site-tree-noicon layui-this">
|
|
<a href="#">
|
|
<cite>第三方应用授权</cite>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div class="site-content">
|
|
<h1>第三方应用授权</h1>
|
|
<div class="site-title">
|
|
<fieldset class="layui-elem-field layui-field-title site-title">
|
|
<legend><a name="use">概述</a></legend>
|
|
</fieldset>
|
|
</div>
|
|
<div class="site-text">
|
|
<p>1、用户对开发者进行应用授权后,开发者可以帮助用户完成相应的业务逻辑。</p>
|
|
<p>2、授权采用标准的OAuth 2.0流程。</p>
|
|
</div>
|
|
|
|
<h1>授权流程</h1>
|
|
<img src="../../assets/image/auth.png" style="width: 700px;"/>
|
|
|
|
<div class="site-title">
|
|
<fieldset class="layui-elem-field layui-field-title site-title">
|
|
<legend><a name="use">快速接入</a></legend>
|
|
</fieldset>
|
|
</div>
|
|
<div class="site-text">
|
|
<h1>第一步:应用授权URL拼装</h1>
|
|
<p><strong>拼接规则:</strong></p>
|
|
<p>http://openauth.yourdomain.com/oauth2/appToAppAuth?app_id=2019032617262200001&redirect_uri=http%3a%2f%2flocalhost%3a8087%2foauth2callback</p>
|
|
<p><strong>参数说明:</strong></p>
|
|
<table class="layui-table">
|
|
<thead>
|
|
<tr>
|
|
<th><strong>参数</strong></th>
|
|
<th><strong>参数名称</strong></th>
|
|
<th><strong>类型</strong></th>
|
|
<th><strong>必填</strong></th>
|
|
<th><strong>描述</strong></th>
|
|
<th><strong>范例</strong></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>app_id</td>
|
|
<td>开发者应用的AppId</td>
|
|
<td>String</td>
|
|
<td>是</td>
|
|
<td>开发者应用的AppId</td>
|
|
<td>2015101400446982</td>
|
|
</tr>
|
|
<tr>
|
|
<td>redirect_uri</td>
|
|
<td>回调页面</td>
|
|
<td>String</td>
|
|
<td>是</td>
|
|
<td>参数需要UrlEncode</td>
|
|
<td>http%3A%2F%2Fexample.com</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h1>第二步:获取code</h1>
|
|
<p>授权成功后,客户端会跳转至开发者定义的回调页面(即redirect_uri参数对应的url),在回调页面请求中会带上当次授权的授权码code和开发者的app_id,示例如下:</p>
|
|
<p>http://devloper.domain.com/oauth2callback?app_id=2015101400446982&code=ca34ea491e7146cc87d25fca24c4cD11</p>
|
|
|
|
<h1>第三步:使用code换取app_auth_token</h1>
|
|
<p>接口名称:open.auth.token.app</p>
|
|
<p>开发者通过code可以换取app_auth_token、授权用户的userId。</p>
|
|
<p><strong>注意:</strong>应用授权的code唯一,code使用一次后失效,有效期24小时; app_auth_token永久有效。</p>
|
|
<p><strong>请求参数说明</strong></p>
|
|
<table class="layui-table">
|
|
<thead>
|
|
<tr>
|
|
<th><strong>参数</strong></th>
|
|
<th><strong>参数名称</strong></th>
|
|
<th><strong>类型</strong></th>
|
|
<th><strong>必填</strong></th>
|
|
<th><strong>描述</strong></th>
|
|
<th><strong>范例</strong></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>grant_type</td>
|
|
<td>授权类型</td>
|
|
<td>String</td>
|
|
<td>是</td>
|
|
<td>如果使用code换取token,则为authorization_code,如果使用refresh_token换取新的token,则为refresh_token</td>
|
|
<td>authorization_code</td>
|
|
</tr>
|
|
<tr>
|
|
<td>code</td>
|
|
<td>授权码</td>
|
|
<td>String</td>
|
|
<td>否</td>
|
|
<td>与refresh_token二选一,用户对应用授权后得到,即第一步中开发者获取到的code值</td>
|
|
<td>bf67d8d5ed754af297f72cc482287X62</td>
|
|
</tr>
|
|
<tr>
|
|
<td>refresh_token</td>
|
|
<td>刷新令牌</td>
|
|
<td>String</td>
|
|
<td>否</td>
|
|
<td>与code二选一,可为空,刷新令牌时使用</td>
|
|
<td>201510BB0c409dd5758b4d939d4008a525463X62</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p><strong>接口请求SDK示例</strong></p>
|
|
<pre class="layui-code">
|
|
@GetMapping("oauth2callback")
|
|
@ResponseBody
|
|
public String callback(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {
|
|
String app_id = servletRequest.getParameter("app_id");
|
|
String code = servletRequest.getParameter("code");
|
|
|
|
OpenAuthTokenAppRequest request = new OpenAuthTokenAppRequest();
|
|
OpenAuthTokenAppModel model = new OpenAuthTokenAppModel();
|
|
model.setCode(code);
|
|
model.setGrant_type("authorization_code");
|
|
request.setBizModel(model);
|
|
|
|
// 根据code获取token
|
|
OpenAuthTokenAppResponse response = openClient.execute(request);
|
|
if (response.isSuccess()) {
|
|
// 成功拿到token,开发者在这里保存token信息
|
|
// 后续使用token进行接口访问
|
|
log.info("授权成功,body:{}", response.getBody());
|
|
}
|
|
return response.getBody();
|
|
}
|
|
</pre>
|
|
</div>
|
|
<p><strong>同步响应参数说明</strong></p>
|
|
<table class="layui-table">
|
|
<thead>
|
|
<tr>
|
|
<th><strong>参数</strong></th>
|
|
<th><strong>参数名称</strong></th>
|
|
<th><strong>类型</strong></th>
|
|
<th><strong>必填</strong></th>
|
|
<th><strong>描述</strong></th>
|
|
<th><strong>范例</strong></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>app_auth_token</td>
|
|
<td>用户授权令牌</td>
|
|
<td>String</td>
|
|
<td>是</td>
|
|
<td>通过该令牌来帮助用户发起请求,完成业务</td>
|
|
<td>856faf8d77d3b985c1073557ce6ea724</td>
|
|
</tr>
|
|
<tr>
|
|
<td>user_id</td>
|
|
<td>授权用户的ID</td>
|
|
<td>String</td>
|
|
<td>是</td>
|
|
<td>授权者id</td>
|
|
<td>1</td>
|
|
</tr>
|
|
<tr>
|
|
<td>expires_in</td>
|
|
<td>令牌有效期</td>
|
|
<td>Long</td>
|
|
<td>是</td>
|
|
<td>负值表示永久有效</td>
|
|
<td>-1</td>
|
|
</tr>
|
|
<tr>
|
|
<td>re_expires_in</td>
|
|
<td>刷新令牌有效期</td>
|
|
<td>Long</td>
|
|
<td>是</td>
|
|
<td>负值表示永久有效</td>
|
|
<td>-3</td>
|
|
</tr>
|
|
<tr>
|
|
<td>app_refresh_token</td>
|
|
<td>刷新令牌时使用</td>
|
|
<td>String</td>
|
|
<td>是</td>
|
|
<td>刷新令牌后,我们会保证老的app_auth_token从刷新开始10分钟内可继续使用,请及时替换为最新token</td>
|
|
<td>88e68196d2359667f0dc8136e6c86803</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><strong>同步响应结果示例</strong></p>
|
|
<pre class="layui-code"><code>{
|
|
"open_auth_token_app_response": {
|
|
"code": "10000",
|
|
"msg": "Success",
|
|
"app_auth_token": "88e68196d2359667f0dc8136e6c86803",
|
|
"app_refresh_token": "856faf8d77d3b985c1073557ce6ea724",
|
|
"expires_in": -1,
|
|
"re_expires_in": -3,
|
|
"user_id": "1"
|
|
},
|
|
"sign": "xxx"
|
|
}
|
|
</code></pre>
|
|
|
|
<p><strong>刷新token</strong></p>
|
|
<pre class="layui-code"><code>
|
|
OpenAuthTokenAppRequest request = new OpenAuthTokenAppRequest();
|
|
OpenAuthTokenAppModel model = new OpenAuthTokenAppModel();
|
|
model.setGrant_type("refresh_token");
|
|
model.setRefresh_token("856faf8d77d3b985c1073557ce6ea724");
|
|
request.setBizModel(model);
|
|
|
|
OpenAuthTokenAppResponse response = openClient.execute(request);
|
|
if (response.isSuccess()) {
|
|
// 成功拿到token,开发者在这里保存token信息
|
|
// 后续使用token进行接口访问
|
|
log.info("换取token成功,body:{}", response.getBody());
|
|
}
|
|
</code></pre>
|
|
</div>
|
|
</div><!-- layui-main end~ -->
|
|
<div class="layui-footer footer footer-doc">
|
|
<div class="layui-main">
|
|
<p>© 2019 <a href="https://gitee.com/durcframework/SOP" target="_blank">SOP</a> MIT license</p>
|
|
</div>
|
|
</div>
|
|
<script src="../../assets/lib/layui/layui.js" charset="utf-8"></script>
|
|
<script src="../../config/config.js" charset="utf-8"></script>
|
|
<script src="../../assets/lib/jquery/3.2.1/jquery.min.js" charset="utf-8"></script>
|
|
<script>
|
|
layui.use('code', function(){ //加载code模块
|
|
layui.code(); //引用code方法
|
|
});
|
|
</script>
|
|
</body>
|
|
</html> |