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

实现OAUTH协议 实现 QQ 第三方登录效果的更多相关文章

  1. PHP实现QQ第三方登录

    PHP实现QQ第三方登录 学习之前,请大家先看一下oAuth协议. 首先呢,我们进入QQ互联的官方网站 http://connect.qq.com登入我们自己的QQ号,没有QQ号的小伙伴可以忽略本篇博 ...

  2. 利用JS_SDK实现QQ第三方登录

    前言 现如今,第三方登录已成为大部分网站必备的一项基础技能,引入时髦的第三方登录不仅能帮你吸引更多的用户,也让你的网站可以充分利用其他大型网站的用户资源.本次教程将让你的网站最快捷便利地引入QQ登录. ...

  3. web实现QQ第三方登录

    开放平台-web实现QQ第三方登录   应用场景     web应用通过QQ登录授权实现第三方登录.   操作步骤     1  注册成为QQ互联平台开发者,http://connect.qq.com ...

  4. Android应用之——最新版本号SDK V2.4实现QQ第三方登录

    为什么要写这篇博客呢?由于.我在做这个第三方登录的时候,找了非常多资料,发现要么就是过时了.要么就是说的非常不清楚.非常罗嗦.并且非常多都是一些小demo,不是什么实例.甚至连腾讯官方的文档都有这个问 ...

  5. thinkphp5.0 QQ第三方登录详解

    一.前期准备工作 到QQ互联官网进行开发资质认证,并创建网站应用.获取到appid和appkey后,下载demo文件. demo文件下载方式:QQ互联>文档资料>SDK及资源下载>p ...

  6. 使用QQ第三方登录时,手机应用和网站应用对同一个QQ号,获取到的openid不一样

    使用QQ第三方登录时,手机应用和网站应用对同一个QQ号,获取到的openid不一样openid生成是根据应用的appid和QQ号的一些信息加密生成,对于一个appid和QQ号来说,openid是唯一的 ...

  7. 【第三方登录】之QQ第三方登录

    最近公司做了个网站,需要用到第三方登录的东西.有QQ第三方登录,微信第三方登录.先把QQ第三方登录的代码列一下吧. public partial class QQBack : System.Web.U ...

  8. QQ第三方登录

    QQ第三方登录 在Android应用程序的开发过程中,很多时候需要加入用户登录/注册模块.除了自己动手设计登录界面并实现相应功能外,现在还可以借助百度.腾讯等开发者平台提供的第三方账号登录模块.最近研 ...

  9. Android 实现QQ第三方登录

    Android 实现QQ第三方登录 在项目中需要实现QQ第三方登录,经过一番努力算是写出来了,现在总结以下,以防以后遗忘,能帮到其他童鞋就更好了. 首先肯定是去下载SDK和DEMO http://wi ...

随机推荐

  1. Java初始化(构造器)

    在类的内部,变量定义的先后顺序决定了初始化的顺序.即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化. import static humeng.com.cnblo ...

  2. chubu

    python解释型语言,不需要编译成机器认可的二进制码,而是直接从源代码运行程序. python是基于c语言开发的. python很容易嵌入到其他语言. 中文注释,必须在前边加上注释说明 : #_*_ ...

  3. Codeforces 731F Video Cards

    题意:给定n个数字,你可以从中选出一个数A(不能对该数进行修改操作),并对其它数减小至该数的倍数,统计总和.问总和最大是多少? 题解:排序后枚举每个数作为选出的数A,再枚举其他数, sum += a[ ...

  4. oracle 10g正则表达式 REGEXP_LIKE 用法

    ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...

  5. gcc常用指令及相关知识

    1,gcc与g++的问题: 1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为是c++程序. 2.编译阶段,g++会调用gcc,对于c++代码,两者是等 ...

  6. JavaSE复习_12 Socket网络编程

    △客户端使用Scanner与BufferedReader的异同,Scanner在客户端调用s.shutdownoutput的时候,将会因为读不到行而报异常,但是BufferedReader的readl ...

  7. HTML5 学习笔记--------》HTML5概要与新增标签!

      一.HTML5概要 1.1.为什么需要HTML5 HTML4陈旧不能满足日益发展的互联网需要,特别是移动互联网.为了增强浏览器功能Flash被广泛使用,但安全与稳定堪忧,不适合在移动端使用(耗电. ...

  8. Linux的中断 & 中断和异常的区别

    参考 http://www.yesky.com/20010813/192117.shtml 结构化程序设计思想认为:程序 = 数据结构 + 算法.数据结构体现了整个系统的构架,所以数据结构通常都是代码 ...

  9. 转:strcat与strcpy与strcmp与strlen

    转自:http://blog.chinaunix.net/uid-24194439-id-90782.html strcat 原型:extern char *strcat(char *dest,cha ...

  10. 转:Unicode汉字编码表

    转自:http://blog.csdn.net/huangxy10/article/details/10012119 Unicode汉字编码表 1 Unicode编码表  Unicode只有一个字符集 ...