【公司内部技术分享】关于java-sdk中处理基于Oauth2.0的服务调用 通用类的使用(2)

  • 说明介绍

目前公司将Java项目的一些公共模块抽离到了公司的统一平台api服务,下一步公司的其他业务模块也将抽离成单独的api服务,api服务采用Spring boot (2.0)+Spring security oauth2的技术路线,为了项目组更加快捷方便的调用公司内部的 api 服务,目前在公司统一的sdk内封装了相关的帮助类,以下是对帮组类的介绍与使用:

  • oauth2.0的帮助类介绍

 帮助类的路径:com.empiresoft.oauth.OauthClient,帮助类目前主要包含oauth2.0的令牌获取,基于oauth2.0的服务调用,主要函数和辅助类介绍:

  1:构造函数

OauthClient oauthClient = new OauthClient(String clientId, String clientSecret, String serviceUrl);

实例OauthClient的时候需提供三个参数:oauth2.0客户端的id,oauth2.0客户端的秘钥,以及oauth2.0服务端的地址(api服务的地址)。

  2:通过信任客户端模式获取令牌

public OauthAccessToken getAccessTokenByClient(String scope);

此函数用于通过客户端模式获取oauth2.0令牌,关于oauth2.0中令牌获取的几种方式的区别,请自行百度了解,scope参数请传递服务端配置的scope。

  3:通过用户名密码模式获取令牌

public OauthAccessToken getAccessTokenByPassWord(String userName, String passWord);

此函数用于通过用户名密码模式获取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 +
                '}';
    }
}

 

posted @ 2018-06-22 15:09  一脸沧桑的刘先生  阅读(1158)  评论(0编辑  收藏  举报