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

相关文章
相关标签/搜索