前几天写了一篇关于网站集成QQ登陆的文章受到很多网友的好评,期间有很多网友私信能不能写一篇关于网站集成新浪微博登陆功能的文章,因而这些天抽空写了这篇文章,但愿能帮到有须要的朋友。html
一.前期准备json
网站要想集成新浪微博登陆功能,你须要先去新浪微博的开放平台注册一个开发者帐号,新浪微博开放平台地址:http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5 注册完了之后,完了登陆后台会有相似以下的一个后台,填好相关信息,具体能够参考下图。最后咱们会有一个App Key和App Secret ,有了这两个东西才能实现后面的集成微博登陆功能。api
二.开发工做安全
当咱们的帐号审核后,微博开发平台会给咱们一个APP ID和APP KEY,有了这两个,咱们就能够进行开发的工做了。服务器
微博开放接口的调用,如发微博、关注等,都是须要获取用户身份认证的。目前微博开放平台用户身份鉴权主要采用的是OAuth2.0。另外,为了方便开发者开发、测试本身的应用,新浪微博还提供了Basic Auth的身份鉴权方式,但Basic Auth仅适用于应用所属的开发者本身调用接口。app
OAuth2.0概述
OAuth2.0较1.0相比,整个受权验证流程更简单更安全,也是将来最主要的用户身份验证和受权方式。dom
关于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事件里加以下方法)ui
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