新浪、QQ OAuth2.0接口应用及简单DZ!NT登录整合
2013-11-23 21:30
465 查看
由于项目需要论坛得整合新浪微博登录,到DZ!NT的论坛逛了一圈只看到QQ登录的插件(貌似不怎么好用,用的是旧接口),只好想办法自己去实现一套,以后要是有什么变动自己改改也方便,顺便也把QQ登录弄上去吧。
相关代码:源代码下载
两家的API都比较简单的,最新的都是OAuth2.0标准的
申请地址:新浪微博 疼逊QQ
认证过程
用户授权返回authorization_code
用authorization_code获取网站专属的access_token
用access_token获取openid
用access_token和openid调用用户授权过的API,如用户信息等
新浪微博默认授权的接口多点,获取用户信息、好友、发微博等(新浪微博API文档)
疼逊默认只授权了获取用户信息,只能获取到openid、昵称、头像(疼逊API文档)
两家接口调用方式也基本一样(参数也基本一样),在获取authorization_code的时候用post方法,其他时候基本都是get方法。
认证实现 新浪版
申请到接口后会得到网站对应的APPID和KEY,配置就不写了,详见代码
1.获取authorization_code
引导用户跳转到授权页面,授权后以url参数形式返回authorization_code
默认code授权模式返回格式:code=code&state=state (state值与调用时的state一致)
2.获取access_token
返回格式是json格式,可直接反序列化 { "access_token": "ACCESS_TOKEN", "expires_in": 1234, "refresh_token": "REFRESH_TOKEN" }
3.获取openid
有了openid就可以调用各种接口了,新浪的接口还比较多的,可以做很多扩展(绑定登录是绑定openid的,新浪的openid都是一样的,疼逊的openid是网站专属的)
4.获取用户信息
新浪的用户信息比丰富,有将近30个字段,返回格式是json,疼逊能获取到的只有昵称、头像、性别
至此,API调用方法就算完成了,疼逊的和新浪的差不多见代码,其中用到的一些工具类见代码Common项目
调用实例-整合DZ!NT
先上一张最后效果图
网站跟论坛在一起,没跨域整合没用DZ!NT的授权方式,偷懒直接引用DNT的DLL弄了下。DZ!NT的授权方式跟新浪、疼逊差不多都是REST模式,想调也是比较方便的。
简单看下登录代码(网站是MVC3的)
绑定就新建张表记录openid跟dnt的uid就行了
论坛顶部的整合登录也是跳到网站来的,DNT也无需做多大的修改,只需要改下_header.htm模版就行了,有两处位置
第一处是在DNT登录form开始那
第二处是在id是um这个div的结束处加上一段ajax调用PartialView的js
嘛~就这样吧,虽然粗糙了点,不过没多大改动(改DNT太痛苦了),新浪微博跟疼逊QQ也都能正常登录绑定了,完工,继续完善。
相关代码:源代码下载
两家的API都比较简单的,最新的都是OAuth2.0标准的
申请地址:新浪微博 疼逊QQ
认证过程
用户授权返回authorization_code
用authorization_code获取网站专属的access_token
用access_token获取openid
用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登录整合
- 新浪、QQ OAuth2.0接口应用及简单DZ!NT登录整合
- servlet 的接口简单应用和filter过滤 用户未登录
- QQ登录整合/oauth2.0认证-01-申请appkey和appid
- QQ登录整合/oauth2.0认证-03-对第二节的代码改进
- 那些年,我们开发的接口之:QQ登录(OAuth2.0)
- 整合了大量的社区登录的接口应用
- PHP QQ 登录接口应用
- QQ登录整合/oauth2.0认证-02-跳转到QQ互联页
- PHP QQ 登录接口应用
- PHP QQ 登录接口应用
- PHP QQ 登录接口应用
- QQ登录整合/oauth2.0认证-04-调整到QQ互联进行QQ登录
- 将QQ登录接口整合到你的网站和如何修改配置
- php实现简单的用户注册,登录,修改个人信息接口
- 基于OAuth2.0协议的QQ第三方授权登录iOS代码分析
- (安卓APP)关于使用偏好设置储存数据,首次登录应用到新手指导页,再次登录直接到主页面简单的相关实现代码
- Java语言编写简单的QQ登录界面 续(1)
- Java Interface接口的简单应用
- QQ第三方登录的应用