OAuth: OAuth(開放授權)是一個開放標準,允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要將用戶名和密碼提供給第三方網站或分享他們數據的所有內容。 QQ登錄OAuth2.0:對於用戶相關的OpenAPI(例如獲取用戶信息,動態同步,照片,日誌,分享等),為了保護用戶數 ...
OAuth: OAuth(開放授權)是一個開放標準,允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要將用戶名和密碼提供給第三方網站或分享他們數據的所有內容。
QQ登錄OAuth2.0:對於用戶相關的OpenAPI(例如獲取用戶信息,動態同步,照片,日誌,分享等),為了保護用戶數據的安全和隱私,第三方網站訪問用戶數據前都需要顯式的向用戶征求授權。
QQ登錄OAuth2.0採用OAuth2.0標準協議來進行用戶身份驗證和獲取用戶授權,相對於之前的OAuth1.0協議,其認證流程更簡單和安全。具體參考文檔 :【QQ登錄】OAuth2.0開發文檔。
QQ互聯網站已經提供了PHP,JS,Android和iOS的SDK,缺少.NET版本的SDK,春節假期期間利用一些空閑時間封裝了一個具有完全功能的.NET SDK,後續將封裝一個對應的Windows Phone的SDK,並開源放在http://opensns.codeplex.com ,專門搭建了一個示例網站http://www.win8charm.com/ 和MSDN風格的線上幫助網站http://help.win8charm.com/ 。今天這篇文章主要介紹使用.NET SDK實施QQ登陸功能。
從這裡http://opensns.codeplex.com/ 下載最新版本的SDK,最新版本是Beta, 完成SDK的封裝,希望大家使用幫忙測試,SDK依賴於Newtonsoft.Json和RestSharp兩個程式集,具體可以參考使用RestSharp 庫消費Restful Service。 主要是兩個類QzoneContext(QQ登陸的上下文數據) 和 QOpenClient (QQ互聯API入口),其他類主要是模型,配置類。
1、你得去http://connect.qq.com/ 申請一個賬號,會得到一個APP ID和App Key,這兩個東東會在生成請求的時候用到。你的去填一些資料,還要提交一些資料審核。
在配置文件web.config加入QQ登陸所需要的一些配置參數,如下圖所示:
<configuration>
<configSections>
<sectionGroup name="QQSectionGroup">
<section name="QzoneSection"
type="System.Configuration.NameValueSectionHandler,System,
Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089" />
</sectionGroup>
</configSections>
<QQSectionGroup>
<QzoneSection>
<add key="AppKey" value="" />
<add key="AppSecret" value="" />
<add key="CallBackURI" value="" />
<add key="AuthorizeURL" value="https://graph.qq.com/oauth2.0/authorize" />
</QzoneSection>
</QQSectionGroup>
AppKey是申請QQ登錄成功後,分配給應用的appid;AppSecret是申請QQ登錄成功後,分配給網站的appkey;CallBackURI是QQ登陸成功後的回調地址:AuthorizeURL是QQ互聯的OAth2認證地址:
2、在項目中添加三個引用Newtonsoft.Json.dll、RestSharp.dll和 QConnectSDK.dll, 在頁面上放置按鈕,打開qq登錄的頁面,然後登錄成功之後回調您的網站的頁面。此時如果用戶在你的網站有賬號,那就可以綁定現有賬號,或者新註冊一個賬號。如果你是新建站,也可以完全使用qq登錄來作為用戶體系。
下麵上代碼:
/// <summary>
/// QQ登陸頁面
/// </summary>
[HttpGet]
public ActionResult Login(string returnUrl)
{
this.Session[RETURNURL] = returnUrl;
var context = new QzoneContext();
string state = Guid.NewGuid().ToString().Replace("-", "");
Session["requeststate"] = state;
string scope =
"get_user_info,add_share,list_album,upload_pic,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,add_one_blog,add_topic,get_tenpay_addr";
var authenticationUrl = context.GetAuthorizationUrl(state, scope);
return new RedirectResult(authenticationUrl);
}
/// <summary>
/// 回調頁面
/// </summary>
public ActionResult QQConnect(LoginModel model)
{
if (Request.Params["code"] != null)
{
QOpenClient qzone = null;
var verifier = Request.Params["code"];
var state = Request.Params["state"];
string requestState = Session["requeststate"].ToString();
if (state == requestState)
{
qzone = new QOpenClient(verifier, state);
var currentUser = qzone.GetCurrentUser();
if (this.Session["QzoneOauth"] == null)
{
this.Session["QzoneOauth"] = qzone;
}
var friendlyName = currentUser.Nickname;
var isPersistentCookie = true;
SetAuthCookie(qzone.OAuthToken.OpenId, isPersistentCookie, friendlyName);
return Redirect(Url.Action("Index", "Home"));
}
}
return View();
}
上面的代碼是ASP.NET MVC的,項目示例運行在http://www.win8charm.com/ ,下麵貼個ASP.NET WebForm的代碼示例:
QQ登陸頁面
namespace OpenConnect.WebSample.Account
{
public partial class LoginToQQ : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
GetRequestToken();
}
private void GetRequestToken()
{
var context = new QzoneContext();
string state = Guid.NewGuid().ToString().Replace("-", "");
string scope =
"get_user_info,add_share,list_album,upload_pic,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,add_one_blog,add_topic,get_tenpay_addr";
var authenticationUrl = context.GetAuthorizationUrl(state,scope);
//request token, request token secret 需要保存起來
//在demo演示中,直接保存在全局變數中.真實情況需要網站自己處理
Session["requeststate"] = state;
Response.Redirect(authenticationUrl);
}
}
}
回調頁面
namespace OpenConnect.WebSample.Account
{
public partial class QQCallback : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request.Params["code"] != null)
{
QOpenClient qzone = null;
User currentUser = null;
var verifier = Request.Params["code"];
string state = Session["requeststate"].ToString();
qzone = new QOpenClient(verifier, state);
currentUser = qzone.GetCurrentUser();
if (null != currentUser)
{
this.result.Text = "成功登陸";
this.Nickname.Text = currentUser.Nickname;
this.Figureurl.ImageUrl = currentUser.Figureurl;
}
Session["QzoneOauth"] = qzone;
}
}
}
這裡說明一下使用QQ互聯登陸是獲取不到用戶的QQ號的,只會獲取到用戶的OpenId,OpenID和QQ號是一一對應關係。
本地測試
- 前提準備,瞭解本地Host文件的作用
- 找到C:\WINDOWS\system32\drivers\etc\hosts這個文件
- 用文本方式打開
- 增加一行:127.0.0.1 www.domain.com
- 啟動本地伺服器
- 啟動瀏覽器訪問 http://www.domain.com/
其他
- 下載: http://opensns.codeplex.com/
- 項目示例:http://www.win8charm.com/
- SDK 線上文檔:http://help.win8charm.com/
- QQ群:80767552
- 註:眾人拾柴火焰高,歡迎各位反饋使用中的bug。
- 報告issue請來:http://opensns.codeplex.com/workitem/list/basic
- 站內信或者下麵方式
- 微博:http://t.qq.com/geffzhang
- 郵箱:geffzhang#qq.com
- 博客:http://www.cnblogs.com/shanyou