分析下如何集成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为例)

 

代码如下:

 

 

Java代码 复制代码  收藏代码
  1. package test   
  2.   
  3. import org.scribe.model.*   
  4. import org.scribe.oauth.*   
  5.   
  6. import dz.oauth.*   
  7. import org.scribe.model.*   
  8. import org.scribe.oauth.*   
  9. import org.scribe.builder.*   
  10.   
  11. import org.dy.web.core.*   
  12. import org.dy.tool.*   
  13.   
  14. class TestOAuth extends Action {   
  15.     String app_id = 'xxx'  
  16.     String app_key = 'xxx'  
  17.     String callback = 'http://localhost:8087/test/test_oauth/callback.gy'  
  18.   
  19.     public Map init(){   
  20.     }   
  21.   
  22.     def Map test_qq(){   
  23.         OAuthService service = new ServiceBuilder().provider(QqzoneApi.class).apiKey(app_id)   
  24.             .apiSecret(app_key).callback(callback).signatureType(SignatureType.QueryString).build()   
  25.   
  26.         Token req_token = service.getRequestToken()   
  27.         String auth_url = service.getAuthorizationUrl(req_token) + '&oauth_callback=' + callback + '&oauth_consumer_key=' + app_id   
  28.         return [v:'redirect:' + auth_url, s_secret:req_token.secret]   
  29.     }   
  30.   
  31.     def Map callback(){   
  32.         String todo_url = 'http://openapi.qzone.qq.com/user/get_user_info'  
  33.   
  34.         OAuthService service = new ServiceBuilder().provider(QqzoneApi.class).apiKey(app_id)   
  35.             .apiSecret(app_key).callback(callback).signatureType(SignatureType.QueryString).build()   
  36.   
  37.         Token req_token = new Token(params.oauth_token, params.s_secret)   
  38.         Verifier verifier = new Verifier(params.oauth_vericode)   
  39.         Token access_token = service.getAccessToken(req_token, verifier)   
  40.         def mat = access_token.getRawResponse() =~ /openid=([^&]+)/   
  41.         String openid = mat[0][1]   
  42.   
  43.         OAuthRequest treq = new OAuthRequest(Verb.GET, todo_url)   
  44.         treq.addQuerystringParameter('openid', openid)   
  45.         service.signRequest(access_token, treq)   
  46.   
  47.         Response response = treq.send()   
  48.   
  49.         return [output:response.getBody()]   
  50.     }   
  51. }  
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()

 

Java代码 复制代码  收藏代码
  1. // QQ   
  2. if(this.api.getClass().getName().indexOf("QqzoneApi") != -1)   
  3.     request.addOAuthParameter(OAuthConstants.VERIFIER_QQ, verifier.getValue());   
  4. else  
  5.     request.addOAuthParameter(OAuthConstants.VERIFIER, verifier.getValue());  
    // 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写的,一样)

 

Java代码 复制代码  收藏代码
  1. package dz.oauth   
  2.   
  3. import org.scribe.builder.api.*   
  4. import org.scribe.model.*   
  5. /*  
  6.     Depends on scribe.jar  
  7. */  
  8. public class QqzoneApi extends DefaultApi10a {   
  9.     static final String AUTHORIZATION_URL = "http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize?oauth_token=%s"  
  10.   
  11.     public String getAccessTokenEndpoint(){   
  12.         return 'http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token'  
  13.     }   
  14.   
  15.     public String getRequestTokenEndpoint(){   
  16.         return 'http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token'  
  17.     }   
  18.   
  19.     public Verb getAccessTokenVerb(){   
  20.         return Verb.GET;   
  21.     }   
  22.   
  23.     public Verb getRequestTokenVerb(){   
  24.         return Verb.GET;   
  25.     }   
  26.   
  27.     public String getAuthorizationUrl(Token requestToken) {   
  28.         return String.format(AUTHORIZATION_URL, requestToken.getToken())   
  29.     }   
  30. }  
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 [email protected]

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>

你可能感兴趣的:(java,tomcat,qq,Access,groovy)