【公司內部技術分享】關於java-sdk中處理基於Oauth2.0的服務調用 通用類的使用(2)

  • 說明介紹

目前公司將Java項目的一些公共模塊抽離到了公司的統一平臺api服務,下一步公司的其餘業務模塊也將抽離成單獨的api服務,api服務採用Spring boot (2.0)+Spring security oauth2的技術路線,爲了項目組更加快捷方便的調用公司內部的 api 服務,目前在公司統一的sdk內封裝了相關的幫助類,如下是對幫組類的介紹與使用:json

  • oauth2.0的幫助類介紹

 幫助類的路徑: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 +
                '}';
    }
}
相關文章
相關標籤/搜索