含義:用戶直接向客戶端注冊,客戶端以自己的名義要求"服務提供商"提供服務,其實不存在授權問題
步驟:
(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博客