授权模式-authorization code
一.模式简介:
authorization code模式:一般被称为"授权码模式",是指第三方应用打开【京东授权页面】,由京东用户使用京东账户在授权页面进行登录授权操作。授权成功后,京东授权认证服务将给予第三方应用访问京东授权账户,并进行相关数据操作的权限令牌
该模式为oauth2.0授权标准内功能最完整,流程最严密的授权模式。需调用的接口传入“京东账户访问令牌码access_token”。code保证了token的安全性,即使code被拦截,由于没有app_secret,也无法通过code获取到token。就是第三方应用程序请求认证授权服务器来获取AccessToken之前的预先校验,增加了获取token的安全性。授权码方式是OAuth2.0最常用的一种授权方式,比如:QQ,豆瓣,新浪微博等用的都是这种方式。

二.适用对象:
所有需接入京东物流系统的外部应用,isv厂商
三.支持以下方式获取账户访问令牌access_token:
京东开放OAuth授权服务生成的"京东账户访问令牌Access Token"有效期为1年。支持通过以下方式获取Access Token
(1)Server-side flow:此流程要求ISV和商家应用有Web Server,能够保持应用本身的密钥以及状态,可以直接访问京东授权服务器。
(2)Refreshing an Access Token:通过前两种流程,获取了Access token以及Rrfresh token(刷新令牌,对于具有“获取Refresh token权限”的应用),Access token都有一定的期限,当Access token过期时,用户可以用Refresh token刷新access_token的有效期(access_token值不变)。四.Server-side flow流程概述
此流程要求应用有Web Server,能够保持应用本身的密钥以及状态,可以通过https直接访问京东授权服务器。如下图所示

该流程总体步骤如下:
(1)开发者先进入“jos开放平台-控制台-应用管理-应用设置”中设置“回调地址”
tips:设置回调地址是因为京东用户账户授权第三方应用使用权限后,京东授权服务往回调地址中推送"临时凭据code"信息。

(2)第三方应用"拼接参数",外调web打开京东授权页面
拼接示例:https://open-oauth.jd.com/oauth2/to_login?app_key={开发者应用app_key}&response_type=code&redirect_uri={开发者接收授权回调的服务地址}&state={商家自定义参数,用于防止csrf跨域攻击,非必传,后续原样返回}&scope=snsapi_base

(3)如果京东用户允许{开发者应用}获取自己京东账户的隐私数据(如商品,订单等),需在此授权页面完成登录授权.
tips:授权即代表【京东用户】同意【第三方应用】对自己的京东账号进行数据操作 
(4)京东用户授权登录后,京东认证服务会拉起应用或重定向到第三方应用网站(见第一步中设置的url地址), 并携带参数“授权临时票据code参数”和“state"
重定向示例:
redirect_uri?code={CODE值}&state={请求打开授权页面时传入的state值,原样回传}
(5)第三方应用通过“code参数”加上“app_key”和“app_secret”等, 通过API换取access_token。参数说明:
拼接示例:
https://open-oauth.jd.com/oauth2/access_token?app_key={开发者应用app_key}&app_secret={开发者应用app_secret}&grant_type=authorization_code&code={上一步接收授权回调时,得到code值}

换取access_token返回说明:

response响应示例: {
"access_token":"a3207b6b5ad04249ad1dbf6a98248bea", //授权账户的访问令牌
"expires_in":3600000, //访问令牌有效期时长(秒)
"refresh_token":"4ecbbab0e9e443159c518da1d10741ad", //刷新令牌,用此值可刷新access_token的有效期时长
"scope":"snsapi_base", //访问令牌的资源权限范围
"open_id":"jos_dev" //授权京东账户的唯一标识
}
(6)开发者使用access_token进行接口调用, 获取授权账户基本数据资源或帮助授权账户实现基本操作
五. Refreshing an Access Token 流程概述
通过上述两种流程,获取了access_token以及refresh_token,但是一般来讲,access_token都有一定的有效期(有效期请参考第七步流程中expire_in参数),在刷新有效时长内必须通过 refresh_token调用API 来延迟 access_token的时长。根据刷新令牌获取访问令牌参数如下:

拼接示例:
https://open-oauth.jd.com/oauth2/refresh_token?app_key={开发者应用app_key}&app_secret={开发者应用app_secret}&grant_type=refresh_token&refresh_token={获取access_token时得到的refresh_token值} 
刷新access_token有效期时长返回说明:

response响应示例:
{
"access_token":"a3207b6b5ad04249ad1dbf6a98248bea", //授权账户的访问令牌
"expires_in":3600000, //访问令牌有效期时长(秒)
"refresh_token":"4ecbbab0e9e443159c518da1d10741ad", //刷新令牌,用此值可刷新access_token的有效期时长
"scope":"snsapi_base", //访问令牌的资源权限范围
"open_id":"jos_dev" //授权京东账户的唯一标识
}