前言

  

  如果您的应用和京东的授权登陆对接后,需要获取一些用户相关的信息,为保证数据的安全性和隐私性,需要取得用户的同意,引导用户授权。授权登陆采用国际通用的OAuth2.0标准协议,目前仅支持网站系统。如果要了解更多关于OAuth2.0的技术说明,请参考官方网站  http://oauth.net/2/ 目前,授权登陆的OAuth2.0支持以下方式获取Access Token ,Token有效时长为30天。

(1)AuthorizationCode 此流程要求ISV和商家应用有WebServer,能够保持应用本身的密钥以及状态,可以通过https直接访问京东的授权服务器。

(2)Rrfreshtoken  通过第一种流程,获取了Access token以及Rrfreshtoken(刷新令牌,对于具有“获取Refresh token权限”的应用),Accesstoken都有一定的期限,当Access token过期时,用户可以用Refresh token延长Accesstoken的时长。

创建应用类型:授权登陆

 首先开发者需要先在JOS注册成为开发者,然后创建 授权登陆 的应用类型,获取JOS分配给开发者的App Key和App Secret

1. 注册成为开发者

首先进入http://jos.jd.com页面,注册成为开发者


按照提示输入相关信息。

2. 创建应用类型:买家/网站应用





输入相关信息后,即可获得网站分配的app key和app secret

 
Authorization Code
 

 此流程要求ISV和商家应用有Web Server,能够保持应用本身的密钥以及状态,可以通过https直接访问京东的授权服务器。

1. 参数说明

获取授权码code参数

 参数名称参数选项 描述 
 response_type 必须 此流程下,该值固定为code
 client_id 必须 即创建应用时的Appkey (从开发者中心申请的应用中获取)
 redirect_uri 必须 应用的回调地址,必须和应用的callback地址匹配。
 state 可选 状态参数,由应用自定义,颁发授权后会原封不动返回
 scope 可选 权限参数,API组名串,多个组名时,用“,”分隔。目前支持参数:暂无
 login 可选 是否强制登陆,true为强制登陆

获取访问令牌Access token参数

 参数名称参数选项 描述 
 grant_type 必须 授权类型,此流程下,该值固定为authorization_code
 code 必须 授权请求中的授权码
 redirect_uri 必须 应用的回调地址,必须和应用的callback主域名匹配。
 client_id 必须 即Appkey(从开发者中心申请的应用中获取)
 client_secret 必须 即Appsecret(从开发者中心申请的应用中获取)
 scope 短授权为必须 权限参数,API组名串,多个组名时,用“,”分隔,目前支持参数:read
 

2. 基本流程

2.1 引导使用应用的用户登录到如下地址获取code

https://openlogin.jd.com/oauth2/login?response_type=code&client_id=YOUR_CLIENT_ID&

redirect_uri=YOUR_REGISTERED_REDIRECT_URI&state=YOUR_CUSTOM_CODE&login=YOUR_LOGIN

释义:client_id:即创建应用获取的Appkey,从开发者中心获取;redirect_url:创建应用时填写的回调地址


2.2 用户登录授权



2.3 获取授权码code

用户同意授权,页面跳转至应用的回调地址,同时返回授权码code以及state参数。



2.4 获取访问令牌access_token

用上一步获取的code和注册应用时分配的AppSecret,通过HttpPost方式换取Token(访问令牌,即Sessionkey),JOS会以json文本的形式返回响应的值

对于程序,可以参考如下代码获取AccessToken

 

String url="https://auth.360buy.com/oauth/token?grant_type=authorization_code&client_id="+appKey

                           +"&client_secret="+ appSecret

                           +"&scope=read&redirect_uri=http://"+ url

                           +"&code="+ code

                           +"&state=1234";

uri = new URL(url);

HttpURLConnection conn =(HttpURLConnection)uri.openConnection();

conn.setRequestProperty("Accept-Charset","utf-8");

conn.setRequestMethod("POST");

int code = conn.getResponseCode();

InputStream is =conn.getInputStream();

String jsonStr =inputStream2String(is);

StringaccessToken = this.getAccessToken(jsonStr);

最后生成的http请求url如下:

https://auth.360buy.com/oauth/token?grant_type=authorization_code&client_id=YOUR_CLIENT_ID&

redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=GET_CODE&state=YOUR_CUSTOM_CODE&client_secret=YOUR_APP_SECRET

可以从http返回结果中,得到AccessToken和Refresh_token以及uid


注释:
expires_in: 失效时间(秒)
time: 授权的时间点(UNIX时间戳,单位:毫秒)
uid: 京东用户的唯一标示(可用来确认唯一用户)

Refresh token
通过前两种种流程,获取了Access token以及Refresh token(对于具有“获取Refreshtoken权限”的应用),但是一般来讲,access token都有一定的失效,在刷新有效时长内必须通过Refresh token来延迟Accesstoken的时长。请求的流程有:https://auth.360buy.com/oauth/token通过httppost请求发送刷新。1. 参数说明
 参数名字 参数选项 参数值 参数释义
 client_id 必选  即创建应用时的Appkey(从开发者中心申请的应用中获取)
 client_secret 必选  即创建应用时的Appsecret(从开发者中心申请的应用中获取)
 grant_type 必选 refresh_token 获取的访问令牌
 refresh_token 必选  授权颁发的刷新令牌
 scope 可选  参见scope的定义
 state 可选  维持应用的状态,传入值与返回值保持一致。

2. 应用示例

然后把responseJson 转化为对象,或者直接从里面提取:access_token字段以及新的刷新令牌https://auth.360buy.com/oauth/token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_ID&grant_type=YOUR_REFRESH_TOKEN&refresh_token=YOUR_REFRESH_TOKEN返回结果内容示例:
access_token会获取到新的,refresh_token则不变。

注释:
expires_in: 失效时间(秒)
time: 授权的时间点(UNIX时间戳,单位:毫秒)
uid: 京东用户的唯一标示(可用来确认唯一用户)

Oauth2.0错误码
客户端异常
101 : 这个应用不存在
102 : 这个应用还没有上线

用户登录时,用户异常如下:
201: 您的IP服务受限,请联系客服解决
202 : 请输入用户名
203 : 用户名不存在
204: 请输入密码
205 : 登录信息与密码不匹配
206 :用户名与密码不匹配,还可尝试{0}次,如失败账户将被冻结2小时
207 :登录失败超过6次,账户已被冻结2个小时
208 : 容器检查登录用户不在应授权用户中
209: 未知异常,请联系管理员

301 :缺少responsetype参数或者为空
302 :缺少clientId 参数 或者为空
303:缺少redirectUri 参数 或者为空
304 :防止session伪造
305:拼写的redirect_uri和注册应用的“回调页面URL”不一致

用户登录时,系统异常如下:

251 : 调用验证登录信息的接口失败
251 :调用验证登录信息接口返回的json串格式错误,解析失败
其他异常
401: 没有此流程的认证权限
402 : 错误的请求
403: url不匹配
404 : 错误客户端
405: 错误scope权限