天天看點

java實作微網誌,QQ登入

第三方登入流程是:先擷取code---->然後擷取access_token----->根據token擷取使用者資訊。

前台頁面實作步驟:點選微網誌登入按鈕---->打開一個子視窗,進行授權------>授權完成,跳轉到首頁或上次浏覽的頁面。

1、寫第三方登入的按鈕,點選按鈕時,打開一個子視窗。

redirect_uri是你在微網誌上設定的回調位址。

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'index.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">

    <meta http-equiv="cache-control" content="no-cache">

    <meta http-equiv="expires" content="0">    

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="This is my page">

    <script type="text/javascript" src="http://statics.2cto.com/js/jquery.min.js"></script>

  </head>

  <script type="text/javascript">

      var qqAuthWin,weiboAuthWin;

    function closeQQWin(){

        var result = $("#qq").val();

        if(result != ""){

            console.log(result);

            qqAuthWin.close();

        }else{

            console.log("值為空");

        }

    }

      function loginQQ(){

          qqAuthWin = window.open("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=CLIENT_ID&state=register&redirect_uri=http://localhost:9090/logback/qq.jsp",

                    'QQ授權登入','width=770,height=600,menubar=0,scrollbars=1,'+

                   'resizable=1,status=1,titlebar=0,toolbar=0,location=1');

      }

    function closeWeiboWin(){

        var result = $("#weibo").val();

        if(result != ""){

            console.log(result);

            weiboAuthWin.close();

        }else{

            console.log("值為空");

        }

    }

      function loginWeibo(){

          weiboAuthWin = window.open("https://api.weibo.com/oauth2/authorize?client_id=CLIENT_ID&response_type=code&state=register&redirect_uri=http://localhost:9090/logback/weibo.jsp",

                    '微網誌授權登入','width=770,height=600,menubar=0,scrollbars=1,'+

           'resizable=1,status=1,titlebar=0,toolbar=0,location=1');

      }

  </script>

  <body>

      <input type="hidden" id="qq" value="">

    <a  href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" onClick="loginQQ()">QQ登入</a>

    <br><br>

    <hr>

    <br>

    <input type="hidden" id="weibo" value="">

    <a href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" onClick="loginWeibo()">微網誌登入</a>

  </body>

</html>

2、回調位址頁(qq.jsp、weibo.jsp)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

String code = request.getParameter("code");//擷取QQ傳回的code

String state = request.getParameter("state");

%>

<!DOCTYPE HTML>

<html>

  <head>

    <base href="<%=basePath%>" target="_blank" rel="external nofollow" >

    <title>My JSP 'weibo.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">

    <meta http-equiv="cache-control" content="no-cache">

    <meta http-equiv="expires" content="0">    

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="This is my page">

    <script type="text/javascript" src="http://statics.2cto.com/js/jquery.min.js"></script>

    <script>

        $(function(){

                var code = "<%=code%>";

                var state = "<%=state%>";

                $.ajax({

                    url:"http://localhost:8080/cms_manage/api/qqLogin",

                    type:"post",

                    data:{code:code,state:state},

                    dataType:"json",

                    success:function(result){

                        result = JSON.stringify(result);

                        console.log(result);

                        //把傳回的資料傳給父視窗的隐藏域中

                        window.opener.document.getElementById("qq").value = result;

                        //授權完成後,關閉子視窗

                        window.opener.closeQQWin();

                    }

                });

        });

    </script>

  </head>

  <body>

        登入成功。

  </body>

</html>

qq.jsp和weibo,jsp是一樣的。。。

3、java代碼

@Controller

public

class

WeiboLoginController {

private

Logger logger = Logger.getLogger(WeiboLoginController.

class

);

private

final

static

String CLIENT_ID = 

""

;

private

final

static

String CLIENT_SERCRET = 

""

;

private

final

static

String GET_TOKEN_URL = 

"https://api.weibo.com/oauth2/access_token"

;

private

final

static

String REDIRECT_URI = 

"http://localhost:9090/logback/weibo.jsp"

;

private

final

static

String GET_USER_INFO = 

"https://api.weibo.com/2/users/show.json"

;

private

final

static

String GET_TOKEN_INFO_URL = 

"https://api.weibo.com/oauth2/get_token_info"

;

private

final

static

String STATE = 

"register"

;

@RequestMapping

(value=

"/api/weiboLogin"

,method=RequestMethod.POST)

@ResponseBody

public

CMS_Result weiboLogin(HttpServletRequest request,HttpServletResponse response){

CMS_Result result = 

null

;

String error_code = request.getParameter(

"error_code"

);

if

(StringUtils.isNotBlank(error_code)){

result = CMS_Result.bulid(

"5001"

"微網誌授權失敗"

);

}

else

{

try

{

//擷取code

String code = request.getParameter(

"code"

);

logger.info(

"code:"

+ code);

//擷取state

String state = request.getParameter(

"state"

);

logger.info(

"state:"

+state);

String access_token = 

""

;

String expires_in = 

""

;

String uid = 

""

;

if

(STATE.equals(state)){

//擷取token

JSONObject token = getAccessToken(code);

access_token = token.getString(

"access_token"

);

uid = token.getString(

"uid"

);

expires_in = String.valueOf(token.getInt(

"expires_in"

));

logger.info(

"token:"

+token);

}

else

{

result = CMS_Result.bulid(

"5001"

"微網誌授權失敗"

);

}

//查詢該使用者資訊

OauthUser oauthUser = oauthUserService.findWeiboByIdentifier(uid);

Master master = 

null

;

if

(oauthUser != 

null

){

master = masterInfoDao.findById(oauthUser.getMaster_id());

}

else

{

//擷取使用者資訊

JSONObject userInfo = getUserInfo(access_token, uid);

logger.info(

"使用者資訊"

+userInfo);

String nickname = userInfo.getString(

"screen_name"

);

String profile_image_url = userInfo.getString(

"profile_image_url"

);

String gender = 

"f"

.equals(userInfo.getString(

"gender"

))?

"1"

:

"0"

;

//向第三方登入表中添加資料

OauthUser user = 

new

OauthUser();

user.setId(UUID.randomUUID().toString());

String master_id = UUID.randomUUID().toString();

user.setMaster_id(master_id);

user.setIdentity_type(

"weibo"

);

user.setIdentifier(uid);

user.setCredential(access_token);

user.setExpires_in(expires_in);

user.setStatus(

"0"

);

oauthUserService.insert(user);

//向使用者表中添加預設資料

Master masterUser = 

new

Master();

masterUser.setId(master_id);

masterUser.setNickname(nickname);

masterUser.setHead_portrait(profile_image_url);

masterUser.setSex(gender);

//由于第三方登入沒有使用者名密碼,而且該字段在資料庫中不為空,在此設定預設使用者名密碼

masterUser.setUser_name(

"wbu"

+access_token.substring(

9

));

masterUser.setPassword(

"wbp"

+access_token.substring(

9

));

masterInfoService.insertDefault(masterUser);

master = masterUser;

}

result = CMS_Result.ok();

}

catch

(Exception e) {

e.printStackTrace();

result = CMS_Result.bulid(

"5001"

"登入失敗"

);

}

}

return

result;

}

private

JSONObject getAccessToken(String code) {

StringBuilder sb = 

new

StringBuilder();

sb.append(

"grant_type=authorization_code"

);

sb.append(

"&client_id="

+ CLIENT_ID);

sb.append(

"&client_secret="

+ CLIENT_SERCRET);

sb.append(

"&redirect_uri="

+ REDIRECT_URI);

sb.append(

"&code="

+ code);

String result = HttpsUtil.post(GET_TOKEN_URL,sb.toString());

JSONObject json = 

new

JSONObject(result);

return

json;

}

private

JSONObject getUserInfo(String access_token,String uid){

StringBuilder sb = 

new

StringBuilder();

sb.append(

"?access_token="

+ access_token);

sb.append(

"&uid="

+ uid);

String result = HttpsUtil.get(GET_USER_INFO+sb.toString());

//傳回參數:檢視http://open.weibo.com/wiki/2/users/show

JSONObject json = 

new

JSONObject(result);

return

json;

}