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 就能够获取对应的帐户信息,这样也就解决了 直接输入账号的问题。