新浪、QQ OAuth2.0接口应用及简单DZ!NT登录整合

转载 2012年03月22日 17:47:18
两家的API都比较简单的,最新的都是OAuth2.0标准的

  申请地址:新浪微博 腾讯QQ

  认证过程

  1. 用户授权返回authorization_code
  2. 用authorization_code获取网站专属的access_token
  3. 用access_token获取openid
  4. 用access_token和openid调用用户授权过的API,如用户信息等

  新浪微博默认授权的接口多点,获取用户信息、好友、发微博等(新浪微博API文档)

  疼逊默认只授权了获取用户信息,只能获取到openid、昵称、头像(腾讯API文档)

  

  两家接口调用方式也基本一样(参数也基本一样),在获取authorization_code的时候用post方法,其他时候基本都是get方法。

  

  认证实现 新浪版

  申请到接口后会得到网站对应的APPID和KEY,配置就不写了,详见代码

  1.获取authorization_code

public string GetAuthCodeUrl(string callback,out string salt)
        {
            string api = "/oauth2/authorize";

            salt = Common.RandomText.String(16);          

            string url = string.Format("{0}{1}?client_id={2}&response_type=code&redirect_uri={3}{4}&state={5}",
                config.BaseUrl, api, config.AppKey, config.Domain, callback, salt);

            return url;
        }

  引导用户跳转到授权页面,授权后以url参数形式返回authorization_code

  默认code授权模式返回格式:code=code&state=state (state值与调用时的state一致)

  2.获取access_token

public SinaAccessToken GetAccessToken(string code, string callback)
        {
            string api = "/oauth2/access_token";
            
            string queryString = string.Format("grant_type=authorization_code&code={0}&client_id={1}&client_secret={2}&redirect_uri={3}{4}", 
                code, config.AppKey, config.AppSecret, config.Domain, callback);

            string apiurl = config.BaseUrl + api;

            string result = OAuthCommon.HttpPost(apiurl, queryString);

            return Common.JsonUtil.Json2.Instance.ToObject<SinaAccessToken>(result);
        }

返回格式是json格式,可直接反序列化      { "access_token": "ACCESS_TOKEN", "expires_in": 1234, "refresh_token": "REFRESH_TOKEN" }

  3.获取openid

public long GetUID(string access_token)
        {
            string api = "/2/account/get_uid.json";

            string url = string.Format("{0}{1}?access_token={2}",
                config.BaseUrl, api, access_token);

            string result = OAuthCommon.HttpGet(url);

            return Common.JsonUtil.Json2.Instance.ToObject<ShortSinaUser>(result).UID;
        }

  有了openid就可以调用各种接口了,新浪的接口还比较多的,可以做很多扩展(绑定登录是绑定openid的,新浪的openid都是一样的,腾讯的openid是网站专属的)

  4.获取用户信息

public SinaUser GetUserInfo(string access_token,long uid)
        {
            string api = "/2/users/show.json";

            string url = string.Format("{0}{1}?access_token={2}&uid={3}",
                config.BaseUrl, api,  access_token, uid);

            string result = OAuthCommon.HttpGet(url);

            return Common.JsonUtil.Json2.Instance.ToObject<SinaUser>(result);
        }

  新浪的用户信息比丰富,有将近30个字段,返回格式是json,疼逊能获取到的只有昵称、头像、性别
  至此,API调用方法就算完成了,疼逊的和新浪的差不多见代码,其中用到的一些工具类见代码Common项目

 

  调用实例-整合DZ!NT
  先上一张最后效果图

  网站跟论坛在一起,没跨域整合没用DZ!NT的授权方式,偷懒直接引用DNT的DLL弄了下。DZ!NT的授权方式跟新浪、腾讯差不多都是REST模式,想调也是比较方便的。

  简单看下登录代码(网站是MVC3的)

public ActionResult SinaLogin()
        {
            if (-1 == page.UID)
            {
                OAuth.Sina request = new OAuth.Sina();
                string salt;
                string url = request.GetAuthCodeUrl("sinacallback", out salt);
                Session["SinaLoginSalt"] = salt;
                return Redirect(url);
            }
            throw new ApplicationException("您已经登录,无须重复登录!若需sina微博绑定请点击顶部sina微博绑定按钮!");
        }

        public ActionResult SinaCallBack()
        {
            if (-1 == page.UID)
            {
                string backSalt = Request.QueryString["state"];
                string code = Request.QueryString["code"];

                if (null != backSalt && null != code && null != Session["SinaLoginSalt"] && backSalt == Session["SinaLoginSalt"].ToString())
                {
                    Session["SinaLoginSalt"] = null;

                    OAuth.Sina request = new OAuth.Sina();

                    OAuth.SinaAccessToken token = request.GetAccessToken(code, "callback");

                    long openid = request.GetUID(token.Access_token);

                    int uid = DNT.SinaDataAccess.GetUID(openid.ToString());

                    if (0 < uid)
                    {
                        return LoginByDzUID(uid);
                    }
                    else
                    {
                        OAuth.SinaUser userInfo = request.GetUserInfo(token.Access_token, openid);

                        Discuz.Entity.UserInfo user = DNT.DntUser.CreateUser(userInfo.screen_name, "");
                        if (0 < user.Uid)
                        {
                            if (0 < DNT.SinaDataAccess.CreateUser(user.Uid, openid.ToString()))
                            {
                                return LoginByDzUID(user.Uid);
                            }
                        }
                    }
                }
                throw new ApplicationException("验证失败!");
            }
            else
            {
                throw new ApplicationException("您已经登录,无须重复登录!若需sina微博绑定请点击顶部sina微博绑定按钮!");
            }
        } 

绑定就新建张表记录openid跟dnt的uid就行了

  

论坛顶部的整合登录也是跳到网站来的,DNT也无需做多大的修改,只需要改下_header.htm模版就行了,有两处位置

  第一处是在DNT登录form开始那


第二处是在id是um这个div的结束处加上一段ajax调用PartialView的js




  嘛~就这样吧,虽然粗糙了点,不过没多大改动(改DNT太痛苦了),新浪微博跟疼逊QQ也都能正常登录绑定了,完工,继续完善。

  相关代码:源代码下载

 

新浪、QQ OAuth2.0接口应用及简单DZ!NT登录整合

由于项目需要论坛得整合新浪微博登录,到DZ!NT的论坛逛了一圈只看到QQ登录的插件(貌似不怎么好用,用的是旧接口),只好想办法自己去实现一套,以后要是有什么变动自己改改也方便,顺便也把QQ登录弄上去吧...
  • ice86rain
  • ice86rain
  • 2013年11月23日 21:30
  • 1204

ASP.NET实现QQ、微信、新浪微博OAuth2.0授权登录

不管是腾讯还是新浪,查看他们的API,PHP都是有完整的接口,但对C#支持似乎都不是那么完善,都没有,腾讯是完全没有,新浪是提供第三方的,而且后期还不一定升级,NND,用第三方的动辄就一个类库,各种配...
  • YourBer
  • YourBer
  • 2015年09月30日 11:44
  • 3161

学习新浪微博开发的OAuth2.0登陆协议(阶段一)

OAuth2.0是一种较安全的登陆第三方应用的协议,它有效的避免用户密码和账户直接登陆第三方应用,因此这种协议的安全性比较高,现在很多应用都采用了这种协议来开放API接口,例如facebook,新浪微...
  • xuguoli_beyondboy
  • xuguoli_beyondboy
  • 2015年05月01日 14:02
  • 1328

第三方登录之QQ登录——OAuth2.0处理流程介绍(以QQ登录为例)

为了让网站更快接入,腾讯提供了JS SDK的接入方案,具体点击这里或者点击这里进行查看。 不过也可以自己写代码,当然你需要了解QQ的OAuth2.0的处理流程(Web Server Fl...
  • qq_36592808
  • qq_36592808
  • 2017年02月07日 18:52
  • 2035

新浪微博第三方登录1:申请接入(OAuth2.0协议)

1. 微博登录OAuth2.0协议开发流程与QQ登录略有不同 申请接入,获取appid和appkey; 开发应用,设置协作者账号,上线之前只有协作者才能进行第三方登录 放置微博登录按钮(这个自己可以用...
  • the_victory
  • the_victory
  • 2016年01月25日 11:42
  • 2551

OAuth2.0简介(QQ登录)

OAuth2.0简介(摘自腾讯开放平台) 目录 [隐藏] 1 1.什么是“QQ登录OAuth2.0”2 2. QQ登录OAuth2.0接入方式3 3. QQ登录OAuth2.0总体处理流程...
  • xifeijian
  • xifeijian
  • 2013年07月01日 23:06
  • 11042

腾讯QQ、新浪微博第三方登录接口申请说明

这一段时间,公司一直要求在网站上加入第三方登录功能。昨天刚刚把接口申请的事项写成文档提交上去。今天趁热打铁,整理一下。并分享给大家。 腾讯QQ第三方登录接口 开发者注册 1.         在...
  • andong154564667
  • andong154564667
  • 2014年03月20日 09:55
  • 12247

Android中的OAuth2.0——QQ第三方授权登录

OAuth2.0概念 OAuth2.0是现在第三方授权主要采取的一种协议。 简易的说就是:第三方应用在不知道用户的用户名、密码等认证ID的情况下想要访问该用户的资源,可通过该用户授权的方式,获取相...
  • yangzhaomuma
  • yangzhaomuma
  • 2016年01月10日 18:09
  • 3833

腾讯QQ第三方登录1:申请接入(OAuth2.0协议)

第三方登录,一般都是遵循OAuth2.0协议。1. QQ登录OAuth2.0协议开发流程1.1 开发流程 申请接入,获取appid和appkey; 开发应用,设置协作者账号,上线之前只有协作者才能进行...
  • the_victory
  • the_victory
  • 2016年01月23日 17:32
  • 2410

腾讯QQ第三方登录2:原理与实现(OAuth2.0协议)

QQ第三方登录执行过程 1 第三方登录图标的代码 2 点击后进入login方法其中的部分代码如下 3 实例化QqSDK类调用getAuthorCode方法获取Authorization CodeQqS...
  • the_victory
  • the_victory
  • 2016年01月25日 11:14
  • 5668
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:新浪、QQ OAuth2.0接口应用及简单DZ!NT登录整合
举报原因:
原因补充:

(最多只允许输入30个字)