1.OAuth的簡述
OAuth(Open Authorization,開放授權)是為用戶資源的授權定義了一個安全、開放及簡單的標准,第三方無需知道用戶的賬號及密碼,就可獲取到用戶的授權信息,並且這是安全的。
1.主要的應用場景
1.目前很多網站集成了新浪微博,QQ等登錄平台,這帶來的好處是不言而喻的,只需要一個QQ號,就可以登錄集成了qq登錄的網站,
不用記住太多的用戶名和密碼,如果QQ能夠一統江湖,對於用戶將是大大的好事。
2.有時候希望訪問授權平台的資源,也可以通過這樣方式實現。
2.運行原理
步驟如下:
1.用戶訪問第三方應用。
2.訪問授權方如QQ的授權界面。
3.用戶在QQ登錄界面上輸入用戶名密碼,進行授權。
4.第三方應用獲取授權信息。
在這個過程中,登錄驗證的操作都在授權方進行。如qq。
2.項目中遇到的問題
在客戶端調用webservice的時候,我們比如需要獲取某個用戶的個人資料信息,我們會這樣使用:
String getInfoByAccount(String account);
我們會傳入帳號,這樣就會帶來一個問題,只要知道某人的帳號,別有用心的用戶就會夠着別人的帳號,獲取別人的隱秘信息。
我想可以通過自己實現OAUTH的方式來自己實現一個。
實現的過程如下:
1.授權在第三方網站,點擊授權方的登錄界面,這個界面在授權服務器上。
2.輸入用戶名密碼后,如果登錄成功,將生成的token 跳轉到第三方的驗證程序上。
3.第三方的驗證程序將token提交到授權端進行驗證,驗證成功后,則返回用戶信息和token。
4.第三方程序將用戶和token寫入到session中。
5.寫入后則代表第三方應用登錄成功。
授權方代碼實現:
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 就可以獲取對應的賬戶信息,這樣也就解決了 直接輸入帳號的問題。