實現OAUTH協議 實現 QQ 第三方登錄效果


1.OAuth的簡述

OAuth(Open Authorization,開放授權)是為用戶資源的授權定義了一個安全、開放及簡單的標准,第三方無需知道用戶的賬號及密碼,就可獲取到用戶的授權信息,並且這是安全的。

1.主要的應用場景

1.目前很多網站集成了新浪微博,QQ等登錄平台,這帶來的好處是不言而喻的,只需要一個QQ號,就可以登錄集成了qq登錄的網站,

不用記住太多的用戶名和密碼,如果QQ能夠一統江湖,對於用戶將是大大的好事。

2.有時候希望訪問授權平台的資源,也可以通過這樣方式實現。

2.運行原理

image

 

 

步驟如下:

1.用戶訪問第三方應用。

2.訪問授權方如QQ的授權界面。

3.用戶在QQ登錄界面上輸入用戶名密碼,進行授權。

4.第三方應用獲取授權信息。

 

在這個過程中,登錄驗證的操作都在授權方進行。如qq。

 

2.項目中遇到的問題

在客戶端調用webservice的時候,我們比如需要獲取某個用戶的個人資料信息,我們會這樣使用:

String getInfoByAccount(String account);

我們會傳入帳號,這樣就會帶來一個問題,只要知道某人的帳號,別有用心的用戶就會夠着別人的帳號,獲取別人的隱秘信息。

我想可以通過自己實現OAUTH的方式來自己實現一個。

實現的過程如下:

image

 

1.授權在第三方網站,點擊授權方的登錄界面,這個界面在授權服務器上。

2.輸入用戶名密碼后,如果登錄成功,將生成的token  跳轉到第三方的驗證程序上。

3.第三方的驗證程序將token提交到授權端進行驗證,驗證成功后,則返回用戶信息和token。

4.第三方程序將用戶和token寫入到session中。

 

5.寫入后則代表第三方應用登錄成功。

授權方代碼實現:

image

 

1.登錄成功后,將當前用戶寫入到一個緩存中,緩存的key,是剛生成的隨機token,value 值 為IAuthUser。

 

2. 授權方對token進行驗證。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String id=request.getParameter("uid");
        response.setContentType("text/json;charset=utf-8");
        
        IAuthService service=AppUtil.getBean(IAuthService.class);
        IAuthUser authuser= service.getByUid(id);
        if(authuser==null){
            response.getWriter().print("{result:-1,msg:\"userNotFound\"}");
        }
        else{
            boolean timeOut=authuser.isTimeOut();
            if(timeOut){
                response.getWriter().print("{result:-2,msg:\"timeout\"}");
            }
            else{
                IUser user=authuser.getUser();
                service.setAuth(user);
                String json="{result:0,id:\""+user.getUserId()+"\",account:\""+user.getAccount()+"\",fullname:\""+user.getFullname()+"\"}";
                response.getWriter().print(json);
            }
        }
    }

3.第三方應用驗證邏輯。

第三方程序提交token給授權方。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String returnUrl=request.getParameter("returnUrl");
        String uid=request.getParameter("uid");
        String data="uid="+ uid;
        
        String json= HttpUtil.sendData(url, data, "");
        
        JSONObject jsonObj=JSONObject.parseObject(json);
        if(jsonObj.getInteger("result")==0){
            String userId=jsonObj.getString("id");
            String account=jsonObj.getString("account");
            String fullname=jsonObj.getString("fullname");
            User user=new User(userId, account, fullname);
            request.getSession().setAttribute(User.CURRENT_USER, user);
            request.getSession().setAttribute(User.CURRENT_ID, uid);
            if(StringUtil.isNotEmpty(returnUrl)){
                response.sendRedirect(returnUrl);
            }
        }
        else{
            response.getWriter().print(json);
        }

 

解決webserivce調用問題

在調用serivce的時候,就不要傳入account了,傳入上下文的token即可, 根據token 就可以獲取對應的賬戶信息,這樣也就解決了 直接輸入帳號的問題。


免責聲明!

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



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