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

1.OAuth的簡述web

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

1.主要的應用場景緩存

1.目前不少網站集成了新浪微博,QQ等登陸平臺,這帶來的好處是不言而喻的,只須要一個QQ號,就能夠登陸集成了qq登陸的網站, 安全

不用記住太多的用戶名和密碼,若是QQ可以一統江湖,對於用戶將是大大的好事。 服務器

2.有時候但願訪問受權平臺的資源,也能夠經過這樣方式實現。session

2.運行原理網站

image

 

 

步驟以下: ui

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

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

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 就能夠獲取對應的帳戶信息,這樣也就解決了 直接輸入賬號的問題。

相關文章
相關標籤/搜索