目前公司將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 + '}'; } }