OAuth2 - 第三方登錄之新浪微博登錄

之前寫過一篇OAuth2 - 第三方登錄之微信登錄,但是微信的開放平臺的資質需要有公司/企業才能註冊。如果是個人的話,可以使用其他個人開發者就可以使用的。比如QQ、新浪微博。
QQ的話,需要審覈之後才能使用,需要手持身份證照。而微博的話,在開發期間使用無需審覈就可以使用。

微博開放平臺 - 創建應用

微博 - 開放平臺地址

1、登錄之後選擇網站接入

在這裏插入圖片描述

2、完善個人開發者信息

在這裏插入圖片描述

3、創建應用

創建自己要使用微博登錄功能的應用。
在這裏插入圖片描述

4、設置回調地址

即登錄授權成功之後的回調地址
在這裏插入圖片描述

5、添加測試用戶

測試用戶即微博用戶,輸入微博暱稱即可。
在這裏插入圖片描述
在開發階段無需審覈,設置完上述內容即可使用。
在這裏插入圖片描述

微博開放平臺 - 登錄流程體驗

1、開發文檔,選擇OAuth2.0,並找到Web網站的授權

微博開發平臺 - 開發文檔
在這裏插入圖片描述
在這裏插入圖片描述

2、根據文檔進行操作
①引導需要授權的用戶到如下地址:
https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI

該地址中有兩個替換的參數

client_id:即App Key

在這裏插入圖片描述

redirect_uri:即回調地址

在這裏插入圖片描述
訪問該地址即跳轉到微博登錄頁面:
在這裏插入圖片描述

②如果用戶同意授權,頁面跳轉至YOUR_REGISTERED_REDIRECT_URI?code=CODE

YOUR_REGISTERED_REDIRECT_URI 即是回調地址。
在這裏插入圖片描述

③換取Access Token

通過返回的code碼去換取Access Token,只有獲取了Token才能爲所欲爲。

https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODE

這是一個POST請求,在體驗這個流程的時候可以通過postman來進行操作。
該地址中有四個替換的參數:

client_id:即App Key
client_secret:即App Secret
redirect_uri:回調地址
code:登錄成功之後,地址欄返回的code值

在這裏插入圖片描述
換取成功返回的JSON結果:
在這裏插入圖片描述

④使用獲得的Access Token調用API

獲取到token之後,就可以憑此調用其他接口(有權限的接口)。
在這裏插入圖片描述
測試 - 獲取用戶信息:
在這裏插入圖片描述

Java中的使用流程

在這裏插入圖片描述

1、引導到登錄頁面
https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI
2、回調地址

登錄授權成功之後,會跳轉到回調地址,並且附帶一個code。
因爲client_secret,也就是AppSecret不能外泄,所以需要在Java代碼內部進行操作。
創建一個Controller作爲回調跳轉的地址,並且接受code,使用code去交換access_token,其中access_token也是不能外泄的
因爲在Java代碼中需要發送請求,所以需要一個HttpsUtils工具類

/**
* HttpUtils請從
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
* 或者直接下載:
* http://code.fegine.com/HttpUtils.zip
*
* 下載相應的依賴請參照
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
* 相關jar包(非pom)直接下載:
* http://code.fegine.com/aliyun-jar.zip
*/
3、模擬微博登錄的方法 - 回調方法
/**
 * 微博登錄回調方法
 * @param code 回調帶回來的code值
 * @return 跳轉的地址
 */
@GetMapping("/oauth2.0/weibo/success")
public String weiboLogin(@RequestParam("code") String code) throw Exception {
    // 頭信息不能爲null
    Map<String, String> header = new HashMap<>();
    // query不能爲null
    Map<String, String> query = new HashMap<>();
    // 這個Map就是body參數體
    Map<String, String> map = new HashMap<>();
    // client_id,即App Key
    map.put("client_id", WeiboConstant.WEIBO_CLIENT_ID);
    // client_secret,即App Secret
    map.put("client_secret",WeiboConstant.WEIBO_CLIENT_SECRET);
    // 固定的grant_type - authorization_code
    map.put("grant_type",WeiboConstant.WEBIBO_GRANT_TYPE);
    // 回調地址
    map.put("redirect_uri",WeiboConstant.WEIBO_REDIRECT_URI);
    // code碼
    map.put("code",code);
    // 發送POST請求 - 獲取access_token
    HttpResponse response = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", header, query, map);
    // 拿到access_token就可以爲所欲爲了 - 前提是有對應調用接口的權限
    if(response.getStatusLine().getStatusCode() == 200){   // 請求狀態爲200,表示成功
    	// 通過getEntity方法可以得到如下格式的JSON字符串
    	/*
    		{
    		"access_token": "2.00gvBwvFEBF9VzcseAe2b7c8Jy47iB",
    		"remind_in": "157679999",
    		"expires_in": 157679999,
    		"uid": "5438845756",
    		"isRealName": "true"
    		}
    	*/
    	// 可以提前創建一個對應這個JSON的POJO類,我這裏對應的POJO類爲SocialUser
    	String json = EntityUtils.toString(response.getEntity());
    	// 轉換成對應的POJO類
    	SocialUser socialUser = JSON.parseObject(json, SocialUser.class);
    	/**
    	 * 此時可以寫一個業務去判斷登錄的用戶是否已經存在
    	 * 一般就通過uid去查詢,如果能查詢出來對應的用戶對象,直接返回即可
    	 * 當然在返回之前還需要更新數據庫中對應的access_token、expires_in字段(令牌和令牌過期時間)
    	 *
    	 * 如果數據庫中不存在,則需要存入數據庫之後返回
    	 */
    	 
    	 // 將這段邏輯封裝成loginService中的一個方法
    	 User user = loginService.login(socialUser);
    	 // 成功返回到主頁,至於user的信息,可以存儲在session中....
    	 return "";
    }else{
    	// 失敗返回登錄頁面,並提示.....
    	return "";
    }
}


// loginService中的login方法
/**
 * 登錄和註冊合併邏輯
 * @param socialUser 微博請求返回的對象
 * @return User則爲系統中真實的對象,即含有暱稱、個性簽名等的對象
 */
public User login(SocialUser socialUser) throws Exception{
	// 獲取uid
	String uid = socialUser.getUid();
	// Dao - 根據uid查詢User
	User user = userDao.selectUserByUid(uid);
	// 要返回的User對象 - userRe
	User userRe = new User();
	if(user != null){  // user存在
		// 替換屬性 - 將查詢出來的user所有屬性複製到userRe中
		BeanUtils.copyProperties(user,userRe);
		// 設置最新的AccessToken和過期時間
		userRe.setAccessToken(socialUser.getAccessToken());
		userRe.setExpiresIn(socialUser.getExpiresIn);
		// 更新
		userDao.updateById(userRe);
	}else{ // user不存在,第一次登陸本系統
		// 查詢微博社交賬號的信息
		Map<String, String> query = new HashMap<>();
		// 根據AccessToken和Uid查詢
		query.put("access_token",socialUser.getAccess_token());
        query.put("uid",socialUser.getUid());
		HttpResponse response = HttpUtils.doGet("https://api.weibo.com", "/2/users/show.json", "get", new HashMap<String, String>(), query);
		if (response.getStatusLine().getStatusCode() == 200){
			// 查詢成功
			String json = EntityUtils.toString(response.getEntity());
			JSONObject jsonObject = JSON.parseObject(json);
			// 暱稱
			String name = jsonObject.getString("name");
			userRe.setNickname(name);
			// ....更多的信息,如頭像地址、個性簽名等,一一設置進去
		}
		userRe.setSocialUid(socialUser.getUid());
        userRe.setAccessToken(socialUser.getAccessToken());
        userRe.setExpiresIn(socialUser.getExpiresIn());
		// 插入到數據庫中
		userDao.insert(userRe);
	}
	// 返回userRe
	return userRe;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章