QQ互联Oauth2.0认证测试

我不太喜欢讲原理,喜欢按照应用流程一步步完成一个测试项目,然后掉过头来看原理。

如此。

首先,我们得建一个应用,这无可厚非。

来个网站应用吧!

填写基本信息时,有个网站地址,我们填写一个自己所维护的外部网站页面地址。

在HEAD标签里按照提示,嵌入验证代码,并加以验证。

回调地址填写相应的域名。

示例:

  

在新建的web项目里新加一个配置文件如下:

app_ID = ********
app_KEY = *************************
redirect_URI = http://www.******************.tk/Qqtest4SDK/afterlogin.do
scope = get_user_info,add_topic,add_one_blog,add_album,upload_pic,list_album,add_share,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idollist,add_idol,del_ido,get_tenpay_addr
baseURL = https://graph.qq.com/
getUserInfoURL = https://graph.qq.com/user/get_user_info
accessTokenURL = https://graph.qq.com/oauth2.0/token
authorizeURL = https://graph.qq.com/oauth2.0/authorize
getOpenIDURL = https://graph.qq.com/oauth2.0/me

这里的redirect_URI是在oauth2.0认证时调用的地址,必须为有效地址,且为同项目下的,我建一个Servlet对应该请求。

我们访问网站地址(并没有做特殊的处理),默认将跳转到本地的index.jsp,jsp的头部之前已经说过,需要添加先关验证<meta>标签

body部分:

  <center>
          <!-- 测试登陆授权 -->
          <a href="/Qqtest4SDK/login.do"><img src="/Qqtest4SDK/img/qq_login.png" /></a>
    </center>

后端Servlet处理请求:

public class IndexServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=utf-8");
        try {

            String reUrl =new Oauth().getAuthorizeURL(request);

            response.sendRedirect(reUrl);
        } catch (QQConnectException e) {
            e.printStackTrace();
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doGet(request,  response);
    }
}

这里我们需要了解下Oauth2.0的相关认证,Eclipse market下载安装JadClipse反编译工具.

Oauth2.0:

构造请求(PC):

Step1:获取 Authorization Code

Get方式:

  https://graph.qq.com/oauth2.0/token

参数:

  response_type 固定为code、client_id为appid、redirect_uri 授权成功后callbackURL、state:client端的状态值

public String getAuthorizeURL(ServletRequest request)
            throws QQConnectException {
        String state = RandomStatusGenerator.getUniqueState();
        ((HttpServletRequest) request).getSession().setAttribute(
                "qq_connect_state", state);
        String scope = QQConnectConfig.getValue("scope");
        if ((scope != null) && (!(scope.equals("")))) {
            return getAuthorizeURL("code", state, scope);
        }
        return QQConnectConfig.getValue("authorizeURL").trim() + "?client_id="
                + QQConnectConfig.getValue("app_ID").trim() + "&redirect_uri="
                + QQConnectConfig.getValue("redirect_URI").trim()
                + "&response_type=" + "code" + "&state=" + state;
    }

Step2:通过 Authorization Code获取令牌Access Token:

授权成功后,解析响应信息,获取authorization code及原始的state:

private String[] extractionAuthCodeFromUrl(String url)
            throws QQConnectException {
        if (url == null) {
            throw new QQConnectException("you pass a null String object");
        }
        Matcher m = Pattern.compile("code=(\\w+)&state=(\\w+)&?").matcher(url);
        String authCode = "";
        String state = "";
        if (m.find()) {
            authCode = m.group(1);
            state = m.group(2);
        }

        return new String[] { authCode, state };
    }

封装信息,并POST请求获取Access Token:

public AccessToken getAccessTokenByRequest(ServletRequest request)
            throws QQConnectException {
        String queryString = ((HttpServletRequest) request).getQueryString();
        if (queryString == null) {
            return new AccessToken();
        }
        String state = (String) ((HttpServletRequest) request).getSession()
                .getAttribute("qq_connect_state");
        if ((state == null) || (state.equals(""))) {
            return new AccessToken();
        }

        String[] authCodeAndState = extractionAuthCodeFromUrl(queryString);
        String returnState = authCodeAndState[1];
        String returnAuthCode = authCodeAndState[0];

        AccessToken accessTokenObj = null;

        if ((returnState.equals("")) || (returnAuthCode.equals(""))) {
            accessTokenObj = new AccessToken();
        } else if (!(state.equals(returnState))) {
            accessTokenObj = new AccessToken();
        } else
            accessTokenObj = new AccessToken(this.client.post(
                    QQConnectConfig.getValue("accessTokenURL"),
                    new PostParameter[] {
                            new PostParameter("client_id", QQConnectConfig
                                    .getValue("app_ID")),
                            new PostParameter("client_secret", QQConnectConfig
                                    .getValue("app_KEY")),
                            new PostParameter("grant_type",
                                    "authorization_code"),
                            new PostParameter("code", returnAuthCode),
                            new PostParameter("redirect_uri", QQConnectConfig
                                    .getValue("redirect_URI")) }, Boolean
                            .valueOf(false)));

        return accessTokenObj;
    }

有了令牌,我们就可以根据令牌获取openid,有了openid我们才可以调用接口。

那么,如何获取openid呢?

Step3:获取Openid

请求地址:https://graph.qq.com/oauth2.0/me

参数  :access_token

Get方式:

private String getUserOpenID(String accessToken) throws QQConnectException {
        String openid = "";
        String jsonp = this.client.get(
                QQConnectConfig.getValue("getOpenIDURL"),
                new PostParameter[] { new PostParameter("access_token",
                        accessToken) }).asString();

        Matcher m = Pattern.compile("\"openid\"\\s*:\\s*\"(\\w+)\"").matcher(
                jsonp);

        if (m.find())
            openid = m.group(1);
        else {
            throw new QQConnectException("server error!");
        }
        return openid;
    }

Step4:调用OpenAPI

以get_user_info接口为例:

  https://graph.qq.com/user/get_user_info?access_token=YOUR_ACCESS_TOKEN&oauth_consumer_key=YOUR_APP_ID&openid=YOUR_OPENID

很简单,构造UserInfo 继承自维护access token和openid的父类,新增返回用户信息UserInfoBean的方法:

在方法里请求以上url并封装响应结果json信息即可:

public class UserInfo extends QQConnect {
    private static final long serialVersionUID = -6124397423510235640L;

    public UserInfo(String token, String openID) {
        super(token, openID);
    }

    private UserInfoBean getUserInfo(String openid) throws QQConnectException {
        return new UserInfoBean(this.client.get(
                QQConnectConfig.getValue("getUserInfoURL"),
                new PostParameter[] {
                        new PostParameter("openid", openid),
                        new PostParameter("oauth_consumer_key", QQConnectConfig
                                .getValue("app_ID")),
                        new PostParameter("access_token", this.client
                                .getToken()),
                        new PostParameter("format", "json") }).asJSONObject());
    }

    public UserInfoBean getUserInfo() throws QQConnectException {
        return getUserInfo(this.client.getOpenID());
    }
}
时间: 2024-10-13 07:31:47

QQ互联Oauth2.0认证测试的相关文章

QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码

OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2.0:对于用户相关的OpenAPI(例如获取用户信息,动态同步,照片,日志,分享等),为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权. QQ登录OAuth2.0采用OAuth2.0标准协议来进行用户身份验证和获取用户授权,相对于之前的OAuth1.0协议,其认证流程

QQ登录整合/oauth2.0认证-02-跳转到QQ互联页

---------------------------目录---------------------------------- QQ登录整合/oauth2.0认证-01-申请appkey和appid ---------------------------正文---------------------------------- 在上一讲里面,主要是 要读者们 先准备一个 appid 和appkey,准备这个 可能需要一段时间审核,公司类型的可能稍微慢一点 其实 关键是 你能有一个可以绑定上域名的空

QQ登录整合/oauth2.0认证-04-调整到QQ互联进行QQ登录

---------------------------------目录------------------------------------- QQ登录整合/oauth2.0认证-03-对第二节的代码改进 (2015-07-07 16:10) QQ登录整合/oauth2.0认证-02-跳转到QQ互联页 (2015-07-06 20:25) QQ登录整合/oauth2.0认证-01-申请appkey和appid (2015-07-06 20:05) -----------------------

什么是“QQ登录OAuth2.0”

1. 什么是“QQ登录OAuth2.0 OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2.0:对于用户相关的OpenAPI(例如获取用户信息,动态同步,照片,日志,分享等),为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权.QQ登录OAuth2.0采用OAuth2.0标准协议来进行用户身份验证和获取用户授权,相对于

新浪微博SSO登录方式及OAUTH2.0认证和获取我的微博

今天弄了下新浪微博SSO登录方式及OAUTH2.0认证和获取我的微博,实现的效果如下图: //========================================================================================================================== 就这么简单的界面,简单的请求json,我居然弄了一整天,主要是新浪微博的文档写的看不懂,感觉他们的文档跟他们的sdk接不上. 遇到的一个问题是: sso pac

C# 网络编程之豆瓣OAuth2.0认证详解和遇到的各种问题及解决

        最近在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同时自己需要一个个的尝试与解决,最终完成了豆瓣API的访问.作者这里就不再吐槽豆瓣的认证文档了,毕竟人家也不容易.但是作者发现关于豆瓣OAuth认证过程的文章非常之少,所以想详细写这样一篇文章方便后面要做同样东西的人阅读.希望文章对大家有所帮助,尤其是想做豆瓣API开发的初学者. (文章中蓝色字表示官方文档引用,红色字是可能遇到问题及注意,黑色字是作者叙述) 一.误区OAuth1.0认证过程    

phpcms V9实现QQ登陆OAuth2.0

phpcmsV9使用的QQ登陆依然是OAuth1.0,但现在腾讯已经不审核使用OAuth1.0的网站了.这对于使用pc的站长来讲是一个无比巨大的坑.经过对phpcms论坛的一位同学做的插件进行修改,现在完美实现QQ登陆,暂无发现bug.测试网站:http://www.zuzwn.com 实现步骤: ①打开\phpcms\modules\member\index.php文件,把下面的代码找个地方塞进去(可以直接在pc默认的QQ登陆下面). 1 //QQ登陆oAuth2.0 2 3 ublic fu

使用Owin中间件搭建OAuth2.0认证授权服务器

前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OAuth2.0服务器,对于涉及的Asp.Net Identity(Claims Based Authentication).Owin.OAuth2.0等知识点已有基本了解.若不了解,请先参考以下文章: MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

oauth2.0认证协议初解

关于oauth2.0认证协议的好处,这里不再做说明,如果是老鸟,也请不要再往下阅读,本文纯粹是作为一名菜鸟对oauth2.0的理解. 首先,要oauth认证需要几个东西:客户端.服务端以及第三方服务提供方,客户端是相对服务端来讲的,实际上第三方服务提供方往往就是客户端的拥有者,就拿某微博第三方服务来说,新浪微博就是服务端,客户端就是第三方服务提供商提供给服务端也就是新浪微博的身份标识,用来给第三方认证提供一个平台,第三方服务通过这个客户端取得用户对这个客户端的授权,然后第三方服务就可以调用一些新