前几天写了一篇关于网站集成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