网站 第三方 登陆 微博、QQ

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

相关文章
相关标签/搜索