如今不少網站都整合了便捷的第三方登陸,如QQ登陸、新浪微博、搜狐、網易等,爲用戶提供很多方便和節約時間。咱們能夠選擇使用JS或SDK實現第三方提供用戶受權API,本文主要講解 JAVA SDK 新浪微博登陸受權以及獲取用戶資料。 html
注:本例子使用的是 SpringMVC,因此若想拷貝代碼直接使用則需本身提早搭建好環境。 java
一、首先申請新浪微博網站接入:http://open.weibo.com/wiki/ session
二、成爲開發者獲得App Key和App Secret app
三、下載weibo4j-oauth2:http://code.google.com/p/weibo4j/downloads/list 網站
四、編寫獲取用戶信息代碼,搞定! ui
下載解壓後,將src目錄下weibo4j文件夾以及config.properties拷貝至本身 JAVA WEB 項目的src目錄下。 google
編輯config.properties配置文件,改爲成本身的資料。第一個填寫你申請的App Key值,第二個填寫App Secret值。 url
1
2
3
|
client_ID =
client_SERCRET =
redirect_URI =
|
第三個redirect_URI,是你的重定向後的網址。應該對應一個控制器(Spring Controller)或 Servlet。在這裏咱們須要兩個網址,第一個網址即用戶在頁面上點擊的網址,能跳轉到新浪微博帳號登陸界面,當用戶點擊帳號登錄界面的登陸按鈕時,新浪微博會去校驗資料正確性,一旦資料正確將會以 get 方式請求而且攜帶參數code重定向到你填寫的redirect_URI,此時就能獲取用戶的資料了。 spa
以小明博客爲例,首先用戶點擊 http://www.bugxm.com/user/login-sian-weibo.html,咱們接收請求後主要工做是重定向到新浪微博登陸頁面。代碼片斷以下: .net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/**
*
* 新浪微博登陸界面
*
* @param session
*
@return
* @throws WeiboException
*/
@RequestMapping(value = "/user/login-sian-weibo.html", method = RequestMethod.GET)
public String loginSinaWeibo(HttpServletRequest request, HttpSession session)
throws WeiboException {
session.setAttribute("login_current_url", request.getHeader("Referer"));
weibo4j.Oauth oauth = new weibo4j.Oauth();
String url = oauth.authorize("code", "");
return "redirect:" + url;
}
|
代碼片斷中的session是爲了獲取用戶登陸前所在頁面URL,方便登陸完後重定向到登陸以前的頁面。其中url是新浪微博登陸界面網址,咱們只須要重定向過去就好了。
當用戶在新浪微博登陸成功後,會重定向到咱們剛纔填寫的redirect_URI中,如我填寫的 http://www.bugxm.com/user/login-sina-weibo.do,對應邏輯代碼片斷以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/**
*
* 新浪微博登陸操做
*
* @param session
*
@return
* @throws WeiboException
*/
@RequestMapping(value = "/user/login-sina-weibo.do", method = RequestMethod.GET)
public String loginSinaWeiboAction(HttpSession session,
@RequestParam String code) throws WeiboException {
String url = (String) session.getAttribute("login_current_url");
session.removeAttribute("login_current_url");
User user = userService.sinaWeiboLoginAction(code,
(User) session.getAttribute("user"));
if (null != user) {
session.setAttribute("user", user);
}
return "redirect:" + url;
}
|
重定向過來會攜帶code參數咱們把值取到用來獲取用戶的資料。本段代碼中的除code、sinaWeiboLoginAction()外都是次要,對本文主題而言無關緊要。咱們來看看sinaWeiboLoginAction()代碼片斷:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
/**
* 新浪微博操做
*
* @param code
* @param currentLoginUser
* 當前登陸用戶,可爲 null
*
@return
* @throws WeiboException
*/
public User sinaWeiboLoginAction(String code, User currentLoginUser)
throws WeiboException {
weibo4j.Oauth oauth = new weibo4j.Oauth();
weibo4j.http.AccessToken accessToken = oauth.getAccessTokenByCode(code);
String uid = accessToken.getUserUid();
weibo4j.Users users = new weibo4j.Users();
users.client.setToken(accessToken.getAccessToken());
weibo4j.model.User user = users.showUserById(uid);
String userDomain = user.getUserDomain(); // 用戶登陸名
String username = user.getScreenName(); // 用戶呢稱
String avatar = user.getAvatarLarge(); // 用戶頭像
String gender = null; // 性別
if ("m".equals(user.getGender())) {
gender = "男";
} else if ("f".equals(user.getGender())) {
gender = "女";
} else {
gender = "未知";
}
// …… 業務邏輯操做,代碼略
return currentLoginUser;
}
|
其中String uid = accessToken.getUserUid();的getUserUid()方法自己是沒有的,咱們須要修改新浪微博的源代碼,否則取uid很是麻煩。
編輯/src/weibo4j.http/AccessToken.java,在:
1
2
3
|
public String getRefreshToken() {
return refreshToken;
}
|
下面添加:
1
2
3
|
public String getUserUid() {
return uid;
}
|
到此就搞定了。用戶的其它資料已經很詳細的註釋在/src/weibo4j/model/User.java中了。