网站 第三方 登录 微博、QQ

前几天写了一篇关于网站集成QQ登录的文章受到不少网友的好评,期间有不少网友私信能不能写一篇关于网站集成新浪微博登录功能的文章,于是这些天抽空写了这篇文章,希望能帮到有需要的朋友。

一.前期准备

网站要想集成新浪微博登录功能,你需要先去新浪微博的开放平台注册一个开发者账号,新浪微博开放平台地址:http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5 注册完了以后,完了登录后台会有类似如下的一个后台,填好相关信息,具体可以参考下图。最后我们会有一个App Key和App Secret ,有了这两个东西才能实现后面的集成微博登录功能。

二.开发工作

当我们的账号审核后,微博开发平台会给我们一个APP ID和APP KEY,有了这两个,我们就可以进行开发的工作了。

微博开放接口的调用,如发微博、关注等,都是需要获取用户身份认证的。目前微博开放平台用户身份鉴权主要采用的是OAuth2.0。另外,为了方便开发者开发、测试自己的应用,新浪微博还提供了Basic Auth的身份鉴权方式,但Basic Auth仅适用于应用所属的开发者自己调用接口。

OAuth2.0概述
OAuth2.0较1.0相比,整个授权验证流程更简单更安全,也是未来最主要的用户身份验证和授权方式。

关于OAuth2.0协议的授权流程可以参考下面的流程图,其中Client指第三方应用,Resource Owner指用户,Authorization Server是我们的授权服务器,Resource Server是API服务器。

开发者可以先浏览OAuth2.0的接口文档,熟悉OAuth2.0的接口及参数的含义,然后我们根据应用场景各自说明如何使用OAuth2.0。具体API文档可以参考微博的官方文档:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI好了,介绍完这些我们现在开始进入正题。
第一步.先在WebConfig中的 <appSettings>节点下加入如下配置

1
2
3
4
< add  key="WeiboAppID" value="第一张截图中微博分配给你网站的App Key" />
< add  key="WeiboAppKey" value="第一张截图中的App Secret"/>
< add  key="WeiboCallBack" value="http://www.mylanqiu.com/Account/WeiboConnect/"/>
< add  key="WeiboAuthorizeURL" value="https://api.weibo.com/oauth2/authorize" />

第二步.在Controllers中加一个登陆的Action(我这边用的是MVC的开发方式,如果是传统.NET的可以直接在.aspx的Page_Load事件里加如下方法)

1
2
3
4
5
6
7
8
9
10
11
public  ActionResult LoginWeibo()
{
string  state =  new  Random(100000).Next(99, 99999).ToString(); //随机数
Session[ "WeiboState" ] = state;
string  appID = ConfigurationManager.AppSettings[ "WeiboAppID" ];
string  qqAuthorizeURL = ConfigurationManager.AppSettings[ "WeiboAuthorizeURL" ];
string  callback = ConfigurationManager.AppSettings[ "WeiboCallBack" ];
string  authenticationUrl =  string .Format( "{0}?client_id={1}&redirect_uri={2}&state={3}" , qqAuthorizeURL, appID, callback, state); //要转跳到微博验证的地址
return  new  RedirectResult(authenticationUrl);
 
}

这一步主要就是实现点击微博登录后出现一个微博授权的页面,大概如下图:

第三步.

在点击了上图的同意登录后(也就是已经使用微博账号在微博平台登录),微博开放平台会通过我们上面配置的回调地址也就是我这边填的http://www.mylanqiu.com/Account/WeiboConnect/返回到这个页面,并会返回一个code给我们,我们到时会使用这个code再去微博开发平台获取access_token,并通过这个access_token获取登录的相关用户信息。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public  ActionResult WeiboConnect()
{
if  (! string .IsNullOrEmpty(Request.Params[ "code" ]) && ! string .IsNullOrEmpty(Request.Params[ "state" ]))
{
var  code = Request.Params[ "code" ];
var  state = Request.Params[ "state" ];
string  requestState = Session[ "WeiboState" ] ==  null  ""  : Session[ "WeiboState" ].ToString();
if  (state == requestState)
{
try
{
 
WeiboOAuthHelper QAuthHelper =  new  WeiboOAuthHelper(); //辅助类
WeiboOauthInfo oauthInfo = QAuthHelper.GetOauthInfo(code); //获取Access Token
string  openID = QAuthHelper.GetOpenID(oauthInfo); //获取用的唯一ID
Session[ "WeiboOpenID" ] = openID;
string  nickName = QAuthHelper.GetUserInfo(oauthInfo, openID);
UserAccount userAccount = AccountBLL.GetUserAccountByOpenID(OAuthPlatform.Weibo.ToString(), openID);
if  (userAccount !=  null )
{
SetAuthCookie(userAccount);
Response.Write( "<script> window.opener.location.reload();window.close();</script>" );
}
ViewData[ "NickName" ] = nickName;
 
}
catch  (Exception ex)
{
return  new  RedirectResult( "~/Error/Error.htm" );
}
}
else
{
return  new  RedirectResult( "~/Error/Error.htm" );
}
}
else
{
return  new  RedirectResult( "~/Error/Error.htm" );
}
return  View();
}

通过上面的代码我们就能实现微博的集成验证,下面把这个辅助类的源代码说一下,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
using  System.Text;
using  System.Configuration;
using  System.Net;
using  System.Web;
using  System.IO;
using  System.Web.Script.Serialization;
namespace  Com.ABC.Mylanqiu.BLL
{
public  class  WeiboOAuthHelper
{
string  appID = ConfigurationManager.AppSettings[ "WeiboAppID" ];
string  appKey = ConfigurationManager.AppSettings[ "WeiboAppKey" ];
/// <summary>
/// 获取oauth信息
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
 
public  WeiboOauthInfo GetOauthInfo( string  code)
{
string  callback = System.Web.HttpUtility.UrlEncode(ConfigurationManager.AppSettings[ "WeiboCallBack" ], Encoding.UTF8);
string  url =  string .Format( "https://api.weibo.com/oauth2/access_token?grant_type={0}&client_id={1}&client_secret={2}&code={3}&redirect_uri={4}" "authorization_code" , appID, appKey, code, callback);
string  res = LoadHtmlUserGetType(url, Encoding.UTF8, "POST" );
JavaScriptSerializer serizalizer =  new  JavaScriptSerializer();
WeiboOauthInfo OauthInfo = serizalizer.Deserialize<WeiboOauthInfo>(res);
return  OauthInfo;
}
 
/// <summary>
/// 通过GET方式获取页面的方法
/// </summary>
/// <param name="urlString">请求的URL</param>
/// <param name="encoding">页面编码</param>
/// <returns></returns>
public  string  LoadHtmlUserGetType( string  urlString, Encoding encoding, string  method)
{
 
HttpWebRequest httpWebRequest =  null ;
HttpWebResponse httpWebRespones =  null ;
Stream stream =  null ;
string  htmlString =  string .Empty;
try
{
httpWebRequest = WebRequest.Create(urlString)  as  HttpWebRequest;
httpWebRequest.Method = method;
}
catch  (Exception ex)
{
throw  new  Exception( "建立页面请求时发生错误!" , ex);
}
 
httpWebRequest.UserAgent =  "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; Maxthon 2.0)" ;
try
{
httpWebRespones = (HttpWebResponse)httpWebRequest.GetResponse();
stream = httpWebRespones.GetResponseStream();
}
catch  (Exception ex)
{
throw  new  Exception( "接受服务器返回页面时发生错误!" , ex);
}
StreamReader streamReader =  new  StreamReader(stream, encoding);
try
{
htmlString = streamReader.ReadToEnd();
 
}
catch  (Exception ex)
{
throw  new  Exception( "读取页面数据时发生错误!" , ex);
}
streamReader.Close();
stream.Close();
return  htmlString;
}
/// <summary>
/// 获取微博账号的OpenID
/// </summary>
/// <param name="qqOauthInfo"></param>
/// <returns></returns>
public  string  GetOpenID(WeiboOauthInfo oauthInfo)
{
string  res = LoadHtmlUserGetType( "https://api.weibo.com/2/account/get_uid.json?access_token="  + oauthInfo.access_token, Encoding.UTF8, "GET" );
JavaScriptSerializer serizalizer =  new  JavaScriptSerializer();
WeiboUserID userInfo = serizalizer.Deserialize<WeiboUserID>(res);
return  userInfo.uid;
}
/// <summary>
/// 获取微博昵称
/// </summary>
/// <param name="qqOauthInfo"></param>
/// <param name="openID"></param>
/// <returns></returns>
public  string  GetUserInfo(WeiboOauthInfo WeiboOauthInfo,  string  userID)
{
 
string  urlGetInfo =  string .Format( @"https://api.weibo.com/2/users/show.json?access_token={0}&uid={1}" , WeiboOauthInfo.access_token, userID);
string  jsonUserInfo = LoadHtmlUserGetType(urlGetInfo, Encoding.UTF8, "GET" );
JavaScriptSerializer serizalizer =  new  JavaScriptSerializer();
WeiboFullUserInfo fullUserInfo = serizalizer.Deserialize<WeiboFullUserInfo>(jsonUserInfo);
return  fullUserInfo.screen_name;
}
}
public  class  WeiboOauthInfo
{
public  string  access_token {  get set ; }
public  string  expires_in {  get set ; }
public  string  remind_in {  get set ; }
public  string  uid {  get ; set ;}
}
public  class  WeiboUserID
{
public  string  uid
{
get ; set ;
}
 
}
public  class  WeiboFullUserInfo
{
public  Int64 id
{
get ;
set ;
}
public  string  screen_name
{
get ;
set ;
}
}
}

四.Demo效果
大家可以直接访问http://www.mylanqiu.com看一下实际的效果,最后还是那句话:赠人玫瑰 手有余香!如觉得对你有帮助则多转发,以帮助更多的人,如有不足,还请指正!

 

PS:原文请访问:http://www.cnblogs.com/bokeyuan123/p/5458055.html#undefined

转载于:https://www.cnblogs.com/Ryansky/p/6030324.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值