目前公司将Java项目的一些公共模块抽离到了公司的统一平台api服务,下一步公司的其余业务模块也将抽离成单独的api服务,api服务采用Spring boot (2.0)+Spring security oauth2的技术路线,为了项目组更加快捷方便的调用公司内部的 api 服务,目前在公司统一的sdk内封装了相关的帮助类,如下是对帮组类的介绍与使用:json
帮助类的路径:com.empiresoft.oauth.OauthClient,帮助类目前主要包含oauth2.0的令牌获取,基于oauth2.0的服务调用,主要函数和辅助类介绍:api
1:构造函数app
OauthClient oauthClient = new OauthClient(String clientId, String clientSecret, String serviceUrl);ide
实例OauthClient的时候需提供三个参数:oauth2.0客户端的id,oauth2.0客户端的秘钥,以及oauth2.0服务端的地址(api服务的地址)。函数
2:经过信任客户端模式获取令牌this
public OauthAccessToken getAccessTokenByClient(String scope);spa
此函数用于经过客户端模式获取oauth2.0令牌,关于oauth2.0中令牌获取的几种方式的区别,请自行百度了解,scope参数请传递服务端配置的scope。code
3:经过用户名密码模式获取令牌blog
public OauthAccessToken getAccessTokenByPassWord(String userName, String passWord);token
此函数用于经过用户名密码模式获取oauth2.0令牌,需传递公司统一平台的帐号和密码。
4:经过短信验证码获取令牌
public OauthAccessToken getAccessTokenBySmsCode(String tel, String smsCode)
此函数用于经过短信验证码模式获取oauth2.0令牌,需传递公司统一平台的帐号手机号码以及短信验证码,关于短信验证码的发送和获取请参考短信发送的章节。
5:刷新令牌
public OauthAccessToken refreshAccessToken(String refreshToken)
OauthAccessToken 获取后,在令牌失效以前可调用此函数刷新令牌获取新的令牌,使用此函数须要了解OauthAccessToken的相关属性,OauthAccessToken 中包含了令牌信息,令牌的过时时间(时间戳),令牌的refreshToken。
注意点:
经过信任客户端模式获取的OauthAccessToken是没有refreshToken信息的,在过时后须要从新调用getAccessTokenByClient获取令牌信息,其余模式则包含refreshToken,客户端在用户输入敏感信息(密码、短信验证码)后拿到refreshToken须要自行保存,过时以前以refreshToken获取新的令牌信息。若是客户端丢失refreshToken,则须要用户从新发起鉴权。
6:调用公共服务(不须要令牌鉴权)
public ActionResult callOpenService(String serviceUrl, String jsonBody, HttpMethod httpMethod)
此函数用于客户端调用api服务中的公共服务接口,serviceUrl是服务地址(须要注意此地址不须要传递api服务的前缀(http://*******),请直接传递如(/open_api/***)),jsonBody是接口要求的json参数,传递json字符串,建议用第三方json帮助类实现转换,不要自行拼接。httpMethod是接口要求的http method,此参数是枚举。
7:调用Oauth服务(须要令牌鉴权)
public ActionResult callOauthService(String serviceUrl, String accessToken, String jsonBody, HttpMethod httpMethod)
此函数用于客户端调用api服务中的Oauth服务接口,serviceUrl是服务地址(须要注意此地址不须要传递api服务的前缀(http://*******),请直接传递如(/open_api/***)),accessToken是令牌信息,jsonBody是接口要求的json参数,传递json字符串,建议用第三方json帮助类实现转换,不要自行拼接。httpMethod是接口要求的http method,此参数是枚举。
8:辅助类HttpMethod:接口的httpMethod参数
1 package com.empiresoft.constant; 2 3 /** 4 * @类名称:HttpMethod 5 * @类描述: 6 * @建立人 刘丹 7 * @建立时间 2018/6/19 8 * @最后修改人 刘丹. 9 * @最后修改时间 2018/6/19. 10 * @版本:1.0 11 */ 12 public enum HttpMethod { 13 GET, POST, DELETE, PATCH 14 }
9:辅助类OauthAccessToken:令牌类
package com.empiresoft.oauth; import org.omg.PortableInterceptor.INACTIVE; /** * @类名称:令牌信息类 * @类描述: * @建立人 刘丹 * @建立时间 2018/6/21 * @最后修改人 刘丹. * @最后修改时间 2018/6/21. * @版本:1.0 */ public class OauthAccessToken { /** * 令牌 */ public String accessToken; /** * 令牌类型 */ public String tokenType; /** * 刷新令牌 */ public String refreshToken; /** * 做用域 */ public String scope; /** * 多少秒之后过时 */ public Integer expiresIn; /** * 具体到期时间戳 */ public Long expiresTime; public String getAccessToken() { return accessToken; } public void setAccessToken(String accessToken) { this.accessToken = accessToken; } public String getTokenType() { return tokenType; } public void setTokenType(String tokenType) { this.tokenType = tokenType; } public String getRefreshToken() { return refreshToken; } public void setRefreshToken(String refreshToken) { this.refreshToken = refreshToken; } public String getScope() { return scope; } public void setScope(String scope) { this.scope = scope; } public Integer getExpiresIn() { return expiresIn; } public void setExpiresIn(Integer expiresIn) { this.expiresIn = expiresIn; } public Long getExpiresTime() { return expiresTime; } public void setExpiresTime(Long expiresTime) { this.expiresTime = expiresTime; } @Override public String toString() { final StringBuffer sb = new StringBuffer("OauthAccessToken{"); sb.append("accessToken='").append(accessToken).append('\''); sb.append(", tokenType='").append(tokenType).append('\''); sb.append(", refreshToken='").append(refreshToken).append('\''); sb.append(", scope='").append(scope).append('\''); sb.append(", expiresIn=").append(expiresIn); sb.append(", expiresTime=").append(expiresTime); sb.append('}'); return sb.toString(); } }
10:辅助类ActionResult:统一返回类
package com.empiresoft.pojo.common; /** * @类名称:全局统一操做结果类 * @类描述: * @建立人 刘丹 * @建立时间 2018/4/10 * @最后修改人 刘丹. * @最后修改时间 2018/4/10. * @版本:1.0 */ public class ActionResult { public static ActionResult newInstance() { return new ActionResult(); } /** * 返回消息 */ private String msg; /** * 操做状态 */ private boolean flag = true; /** * 结果(返回值) */ private Object result; /** * 须要跳转的地址 */ private String jumpUrl; /** * 执行时间 */ private long time; /** * 操做状态码 */ private Integer resultCode; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public Object getResult() { return result; } public void setResult(Object result) { this.result = result; } public String getJumpUrl() { return jumpUrl; } public void setJumpUrl(String jumpUrl) { this.jumpUrl = jumpUrl; } public long getTime() { return time; } public void setTime(long time) { this.time = time; } public Integer getResultCode() { return resultCode; } public void setResultCode(Integer resultCode) { this.resultCode = resultCode; } @Override public String toString() { return "ActionResult{" + "msg='" + msg + '\'' + ", flag=" + flag + ", result=" + result + ", jumpUrl='" + jumpUrl + '\'' + ", time=" + time + ", resultCode=" + resultCode + '}'; } }