`

分析下如何集成QQ登陆到你自己的网站上——Java平台

阅读更多

目的:如题。。。

 

准备工作:

1.找一个现成的OAuth的Java客户端包——我选择scribe,版本1.2,在http://oauth.net/code/上下载。

2.准备QQ开放平台的文档说明,以在实践的过程中查阅参考。

3.在http://connect.opensns.qq.com/上申请一个登陆的app_id。(其中登陆那个callback url是死的,不好调试,可以修改hosts加上proxy到你的服务器端口)

 

QQ开放平台的文档说明具体为

http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91Qzone_OAuth%E8%AE%A4%E8%AF%81%E7%AE%80%E4%BB%8B

 

开始弄一个工程,可以是本地的,也可以是web的:(以web为例)

 

代码如下:

 

 

package test

import org.scribe.model.*
import org.scribe.oauth.*

import dz.oauth.*
import org.scribe.model.*
import org.scribe.oauth.*
import org.scribe.builder.*

import org.dy.web.core.*
import org.dy.tool.*

class TestOAuth extends Action {
	String app_id = 'xxx'
	String app_key = 'xxx'
	String callback = 'http://localhost:8087/test/test_oauth/callback.gy'

	public Map init(){
	}

	def Map test_qq(){
		OAuthService service = new ServiceBuilder().provider(QqzoneApi.class).apiKey(app_id)
			.apiSecret(app_key).callback(callback).signatureType(SignatureType.QueryString).build()

		Token req_token = service.getRequestToken()
		String auth_url = service.getAuthorizationUrl(req_token) + '&oauth_callback=' + callback + '&oauth_consumer_key=' + app_id
		return [v:'redirect:' + auth_url, s_secret:req_token.secret]
	}

	def Map callback(){
		String todo_url = 'http://openapi.qzone.qq.com/user/get_user_info'

		OAuthService service = new ServiceBuilder().provider(QqzoneApi.class).apiKey(app_id)
			.apiSecret(app_key).callback(callback).signatureType(SignatureType.QueryString).build()

		Token req_token = new Token(params.oauth_token, params.s_secret)
		Verifier verifier = new Verifier(params.oauth_vericode)
		Token access_token = service.getAccessToken(req_token, verifier)
		def mat = access_token.getRawResponse() =~ /openid=([^&]+)/
		String openid = mat[0][1]

		OAuthRequest treq = new OAuthRequest(Verb.GET, todo_url)
		treq.addQuerystringParameter('openid', openid)
		service.signRequest(access_token, treq)

		Response response = treq.send()

		return [output:response.getBody()]
	}
}

 

 

然后就接上

 

 

Step4:Qzone引导用户跳转到第三方应用

 

 

然后就可以根据获取的临时token和openid去调用你想调用QQ开放出来的api了——

 

http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91API%E6%96%87%E6%A1%A3

 

特别说明:

1.scribe这个包针对QQ的oauth有的verifier需要修改下

OAuth10aServiceImpl.getAccessToken()

 

    // QQ
    if(this.api.getClass().getName().indexOf("QqzoneApi") != -1)
    	request.addOAuthParameter(OAuthConstants.VERIFIER_QQ, verifier.getValue());
    else
    	request.addOAuthParameter(OAuthConstants.VERIFIER, verifier.getValue());
 

 

2.令附上QqzoneApi.java的代码(我用groovy写的,一样)

 

package dz.oauth

import org.scribe.builder.api.*
import org.scribe.model.*
/*
	Depends on scribe.jar
*/
public class QqzoneApi extends DefaultApi10a {
	static final String AUTHORIZATION_URL = "http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize?oauth_token=%s"

	public String getAccessTokenEndpoint(){
		return 'http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token'
	}

	public String getRequestTokenEndpoint(){
		return 'http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token'
	}

	public Verb getAccessTokenVerb(){
		return Verb.GET;
	}

	public Verb getRequestTokenVerb(){
		return Verb.GET;
	}

	public String getAuthorizationUrl(Token requestToken) {
		return String.format(AUTHORIZATION_URL, requestToken.getToken())
	}
}

  3.SignatureType 记得是QueryString的

 

 

华丽的分割线***************************

哎——不喜欢脚本的java童鞋们啊,我花十几分钟弄一个tomcat应用,再贡献出来我的appid,你们下载源码看吧(Tomcat war)。至于callback里转发的,麻烦你的hosts文件里指定下

hosts:

 

127.0.0.1 www.echanging.com

127.0.0.1 echanging.com

 

apache vhost:

 

<VirtualHost 127.0.0.1>

ServerAdmin segment11@gmail.com

DocumentRoot "E:/Program/workspace/oauth-qq-demo"

ServerName www.echanging.com

ServerAlias echanging.com

ErrorLog logs/echanging.error_log

CustomLog logs/echanging.log common

 

<Directory "E:/Program/workspace/oauth-qq-demo">

AllowOverride all

Allow from all

</Directory>

 

ProxyPass /oauth-qq-demo http://localhost:8080/oauth-qq-demo

ProxyPassReverse /oauth-qq-demo http://localhost:8080/oauth-qq-demo

</VirtualHost>

 

够详细了吧——再搞不定,我就吐血了——

分享到:
评论
12 楼 smilerain 2011-06-05  
key232323 写道
smilerain 写道
想问一下,这东西只能web登录吗,我想做一个即时通信软件,想用这个登录行吗?


当然可以,模拟http啊。

问题的关键的申请的时候必须要你填写网站域名这些,要实现要运用软件这一步,模拟http就麻烦了
11 楼 httpclient_bd 2011-06-03  
直接写oauth客户端好了, qq是v1的, 但是又有1a的一些倾向, veirfyCode就是一个特征,但是还支持auth时候的callback绑定, 有的只支持header有的header和get都支持, 别看OAUTH是统一的, 实际上奇奇怪怪的各厂商自己实现的是不太好统一的。
10 楼 key232323 2011-06-02  
smilerain 写道
想问一下,这东西只能web登录吗,我想做一个即时通信软件,想用这个登录行吗?


当然可以,模拟http啊。
9 楼 key232323 2011-06-02  
Qiao.Gbin 写道
这个。。。。腾讯的api都给你了。
我刚弄好,这个还要找sdk啊?
腾讯的文档写的很清楚的。。。


oauth是有规范的好不——你也可以自己模拟http get url,一样的,只不过oauth这么搞,那些以oauth开放出来的平台资源访问起来,就一致了么。

其实就是模拟http请求,加上加密——本来一个简单至极的东西大家别被迷惑了。
8 楼 Qiao.Gbin 2011-06-02  
这个。。。。腾讯的api都给你了。
我刚弄好,这个还要找sdk啊?
腾讯的文档写的很清楚的。。。
7 楼 jin52yang 2011-06-02  
可以共享scribe的代码到http://code.google.com/p/open-qq/吗?
我正在规划优化代码,移除所有的依赖。
6 楼 smilerain 2011-06-02  
想问一下,这东西只能web登录吗,我想做一个即时通信软件,想用这个登录行吗?
5 楼 weng 2011-06-02  
有空再玩玩
4 楼 key232323 2011-06-01  
kjj 写道
class TestOAuth extends Action {  
    String app_id = 'xxx'  
    String app_key = 'xxx'  
    String callback = 'http://localhost:8087/test/test_oauth/callback.gy'  
  
    public Map init(){  
    }  
  
    def Map test_qq(){  
        OAuthService service = new ServiceBuilder().provider(QqzoneApi.class).apiKey(app_id)  
            .apiSecret(app_key).callback(callback).signatureType(SignatureType.QueryString).build()  
  
        Token req_token = service.getRequestToken()  
        String auth_url = service.getAuthorizationUrl(req_token) + '&oauth_callback=' + callback + '&oauth_consumer_key=' + app_id  
        return [v:'redirect:' + auth_url, s_secret:req_token.secret]  
    }  



我没看懂,def Map 这是什么语言,你这个javac可以编译通过吗!!!!!!!!!!!!!


吐血啊——我也弄一个和douyu类似的mvc框架——不过是基于groovy的,用spring mvc原语表达这一段代码就是:

class MyController extends AbstractController{
  @Path('')
  public ModelAndView testQq(){
    // set session attribute and redirect response
  }

  public ModelAndView callback(){
    // get session attribute value and ....
  }

}
3 楼 kjj 2011-06-01  
class TestOAuth extends Action {  
    String app_id = 'xxx'  
    String app_key = 'xxx'  
    String callback = 'http://localhost:8087/test/test_oauth/callback.gy'  
  
    public Map init(){  
    }  
  
    def Map test_qq(){  
        OAuthService service = new ServiceBuilder().provider(QqzoneApi.class).apiKey(app_id)  
            .apiSecret(app_key).callback(callback).signatureType(SignatureType.QueryString).build()  
  
        Token req_token = service.getRequestToken()  
        String auth_url = service.getAuthorizationUrl(req_token) + '&oauth_callback=' + callback + '&oauth_consumer_key=' + app_id  
        return [v:'redirect:' + auth_url, s_secret:req_token.secret]  
    }  



我没看懂,def Map 这是什么语言,你这个javac可以编译通过吗!!!!!!!!!!!!!
2 楼 azheng270 2011-05-31  
不错噢,又有新东西玩了
1 楼 key232323 2011-05-31  
自己做沙发——

官方已经给了http://code.google.com/p/open-qq/

代码我都读过,感觉用我这种scribe的形式,依赖包少些,还不错(尤其是httpclient,现在URLConnection已经很不错的)。

相关推荐

    java毕业设计——基于java的QQ屏幕截图工具的设计与实现(论文+答辩PPT+源代码+数据库).zip

    java毕业设计——基于java的QQ屏幕截图工具的设计与实现(论文+答辩PPT+源代码+数据库).zip java毕业设计——基于java的QQ屏幕截图工具的设计与实现(论文+答辩PPT+源代码+数据库).zip java毕业设计——基于java的QQ...

    java毕业设计——基于Java的QQ屏幕截图工具的设计与实现(论文+答辩PPT+源代码+讲解视频).zip

    java毕业设计——基于Java的QQ屏幕截图工具的设计与实现(论文+答辩PPT+源代码+讲解视频).zip java毕业设计——基于Java的QQ屏幕截图工具的设计与实现(论文+答辩PPT+源代码+讲解视频).zip vjava毕业设计——基于...

    Java实习报告——山寨QQ聊天工具设计

    【Java实习报告——山寨QQ聊天工具设计】 这份实习报告详细记录了一个基于Java的简易聊天系统的开发过程,项目名为"My_QQ",旨在模仿QQ的基本功能,包括登录、注册、单人及多人聊天,并且退出应用。这个项目是针对...

    页面置换——————————java

    操作系统,页面置换LRU。。。。。。。。。。。。。。。。。。

    Java开发——qq图片.zip

    综上所述,"Java开发——qq图片.zip"的资源可能涵盖了Java GUI设计、图片加载与处理、布局管理等多个方面,对于学习和实践Java桌面应用或移动应用的UI开发具有很大的参考价值。通过深入理解这些知识点,开发者可以...

    java网络程序——QQ聊天程序

    通过深入学习以上知识点,并结合"java网络编程--qq聊天程序"的项目实践,你将能够构建自己的网络聊天应用程序,理解JAVA WEB编程的核心技术和QQ聊天程序的实现原理。同时,不断研究和实践新技术,提升你的编程能力和...

    Java————————进阶

    适合复习java进阶

    Java毕业设计——基于Java的QQ屏幕截图工具的设计与实现(论文+答辩PPT+源代码+数据库).zip

    本项目是一个Java毕业设计,主要目标是开发一个基于Java的QQ屏幕截图工具。这个工具能够帮助用户方便快捷地捕获并处理屏幕上的图像,模仿QQ的截图功能,提供了一种实用的桌面应用体验。设计与实现的过程涵盖了软件...

    java——农历表达类

    综上所述,实现“java——农历表达类”涉及到的不仅仅是编写代码,还包括对日期处理的理解、类设计、用户交互、异常处理、测试验证等多个方面的知识。在实际开发中,应确保代码的清晰性和可维护性,同时兼顾性能和...

    Java课程设计——饭卡管理系统(JavaSwing、JavaFX、MySQL)

    * 项目名:Java课程设计——饭卡管理系统(JavaSwing、JavaFX、MySQL) * @author :第四维度 * 创建时间:2021-6-21 * 采用JavaSwing、JavaFX设计UI界面,结合MySQL数据库进行增删改查操作,功能较为完善 * 包含...

    安卓Android源码——高仿QQ登陆.zip

    "安卓Android源码——高仿QQ登陆.zip"是一个针对Android平台的源码项目,旨在帮助开发者学习和模仿QQ登录界面的设计与实现。这个压缩包包含了TestLogin模块,我们可以从中抽取出一系列关于Android开发的知识点。 1....

    山寨版QQ--存Java实现!!

    《山寨版QQ——Java实现详解》 在信息技术领域,编程语言的选择往往决定了软件的特性和应用范围。Java作为一门跨平台、面向对象的编程语言,因其强大的可移植性和丰富的类库,深受开发者喜爱。本篇文章将围绕一个...

    QQ-login.rar_java QQ login_qq login java

    项目标签"java_qq_login"和"qq_login_java"明确了项目的核心技术——使用Java进行QQ登录界面的实现。这意味着开发者可能使用了Java的事件监听机制,例如ActionListener,来处理按钮点击事件,触发登录验证逻辑。登录...

    【伯克利CS61B教材——Java 学习教程】 Head First Java 中文版

    《Head First Java》是伯克利大学CS61B课程推荐的一本经典的Java学习教程,尤其适合初学者。这本书以其独特的“Head First”教学风格,将复杂的编程概念以易理解、生动有趣的方式呈现,帮助读者快速掌握Java编程基础...

    Jstack分析工具——IBM Thread and Monitor Dump Analyzer for Java

    需要本地安装JDK并配置JAVA环境变量。 之后使用java -jar jca469.jar即可打开工具。 直接将dump出来的堆栈信息,打开,便可分析。

    java——Graphics.pdf

    Java中的`Graphics`类是Java 2D API的核心部分,用于在Java图形用户界面(GUI)上进行绘制。`Graphics`类提供了各种方法,如绘制直线、曲线、文本、图像等基本图形。在这个讨论中,我们将深入理解Java GUI重绘机制、...

    Java课程设计——通讯录

    定义人员(staff)类,从person类派生,至少包括电话、地址、邮政编码、邮箱、QQ号和类别(例如:同学、朋友等)。 功能设计: 1、设计菜单实现功能选择; 2、输入功能:输入人员信息,并保存到文件中; 3、查询...

    《JAVA课程设计》--Java课程设计——QQ聊天.zip

    本人十余年JAVA从业经验,精通JAVA高可用、分布式、高并发系统架构设计。有志于做JAVA职业规划、技术提升的可与我联系,交个朋友~ 本人十余年JAVA从业经验,精通JAVA高可用、分布式、高并发系统架构设计。有志于做...

    java实现的简单qq功能

    在IT行业中,编程语言Java因其跨平台性和丰富的库支持,被广泛应用于各种系统开发,包括网络通信应用。本项目以“java实现的简单qq功能”为主题,旨在介绍如何使用Java来构建一个类似QQ的即时通讯工具,具备在线聊天...

Global site tag (gtag.js) - Google Analytics