1.OAuth的簡述web
OAuth(Open Authorization,開放受權)是爲用戶資源的受權定義了一個安全、開放及簡單的標準,第三方無需知道用戶的帳號及密碼,就可獲取到用戶的受權信息,而且這是安全的。json
1.主要的應用場景緩存
1.目前不少網站集成了新浪微博,QQ等登陸平臺,這帶來的好處是不言而喻的,只須要一個QQ號,就能夠登陸集成了qq登陸的網站, 安全
不用記住太多的用戶名和密碼,若是QQ可以一統江湖,對於用戶將是大大的好事。 服務器
2.有時候但願訪問受權平臺的資源,也能夠經過這樣方式實現。session
2.運行原理網站
步驟以下: ui
1.用戶訪問第三方應用。 url
2.訪問受權方如QQ的受權界面。 spa
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 就能夠獲取對應的帳戶信息,這樣也就解決了 直接輸入賬號的問題。