【oauth2.0】【2】JAVA 客戶端模式


含義:用戶直接向客戶端注冊,客戶端以自己的名義要求"服務提供商"提供服務,其實不存在授權問題

步驟:

(A)客戶端向認證服務器進行身份認證,並要求一個訪問令牌(token)。

(B)認證服務器確認無誤后,向客戶端提供訪問令牌。

(C)用令牌請求資源服務器的資源

摘要:

1,JAVA代碼中訪問

2,Postman中訪問

3,Swagger中訪問

正文:

1,JAVA代碼中訪問

我的環境是Spring Boot,實現代碼:

pom.xml

<dependency>
    <groupId>org.apache.oltu.oauth2</groupId>
    <artifactId>org.apache.oltu.oauth2.client</artifactId>
    <version>0.31</version>
</dependency>

 

OAuthClientUtil.java

public class OAuthClientUtil {
    private static Logger logger = LoggerFactory.getLogger(OAuthClientUtil.class.getName());

    //Config.ACCESS_TOKEN_URL 認證服務器獲取token的地址;Config.OAUTH_USERNAME 賬號;Config.OAUTH_PASSWORD:密碼
    public static String getApiToken()throws OAuthProblemException{
        logger.info("api getApiToken");
        String accessToken = null;
        OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
        try {
            OAuthClientRequest request = OAuthClientRequest
                    .tokenLocation(Config.ACCESS_TOKEN_URL)
                    .setGrantType(GrantType.CLIENT_CREDENTIALS)
                    .setUsername(Config.OAUTH_USERNAME)
                    .setPassword(Config.OAUTH_PASSWORD)
                    .buildQueryMessage();

            request.addHeader("Accept", "application/json");
            request.addHeader("Content-Type", "application/json");
            String auth = Base64Util.encode(Config.OAUTH_USERNAME + ':' + Config.OAUTH_PASSWORD);
            request.addHeader("Authorization", "Basic " + auth);

            OAuthAccessTokenResponse oAuthResponse = oAuthClient.accessToken(request, OAuth.HttpMethod.POST); //去服務端請求access_token,並返回響應
            accessToken = oAuthResponse.getAccessToken(); //獲取服務端返回過來的access_token
            logger.info("api token: " + accessToken);
        } catch (OAuthSystemException e) {
            e.printStackTrace();
        }

        return accessToken;
    }

}

 

Base64Util.java

public class Base64Util {
        //編碼
        public static String encode(String s) {
            if (s == null)
                return null;
            String res = "";
            try {
                res = new sun.misc.BASE64Encoder().encode(s.getBytes("GBK"));
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return res;
        }

        //解碼
        public static String decode(String s) {
            if (s == null)
                return null;
            BASE64Decoder decoder = new BASE64Decoder();
            try {
                byte[] b = decoder.decodeBuffer(s);
                return new String(b,"GBK");
            } catch (Exception e) {
                return null;
            }
        }
}

 

使用授權訪問接口

public String scanTrainQrode(String param) {
    String respContent = ""; //返回的內容
    String apiToken = null;
    try {
        apiToken = OAuthClientUtil.getApiToken(); //獲取token
        String requestUrl = String.format(Config.URL, param, apiToken); //拼接接口地址(例:https://cn.bing.com?param=param&api_token=apiToken)
        String result = HttpHelper.SendPOST(requestUrl); //訪問接口地址

        if (StringUtils.isNotBlank(result)) { //解析返回的結果
            JSONObject jsonObject = JSONObject.fromObject(result);
            if(jsonObject.containsKey("msg")) respContent = jsonObject.getString("msg");
        }
    } catch (OAuthProblemException e) {
        e.printStackTrace();
    }
    return respContent;
}

 

2,Postman中訪問

Postman為模擬網絡請求的工具,見參考博客2

-------------------------------------------

 

3,Swagger中訪問

value中填寫bearer + 空格 + token(例:bearer 49305daf-e566-4f9d-8f83-e74af5ae47e1)

 

參考博客:

1,Java的oauth2.0 服務端與客戶端的實現 - jing12062011的博客 - CSDN博客
https://blog.csdn.net/jing12062011/article/details/78147306

2,Oauth2授權模式訪問之客戶端模式(client_credentials)訪問 - 面朝大海,春暖花開 - CSDN博客

https://blog.csdn.net/u013887008/article/details/80574905


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM