Oauth2认证以及新浪微博开放平台应用
一、OAuth2.0概述
大部分API的访问如发表微博、获取私信,关注都需要用户身份,目前新浪微博开放平台用户身份鉴权有OAuth2.0和Basic Auth(仅用于应用所属开发者调试接口),新版接口也仅支持这两种方式。OAuth2.0较1.0相比整个授权验证流程更简单更安全,也是未来最主要的用户身份验证和授权方式。 关于OAuth2.0协议授权流程查看OAuth2.0授权流程 ,其中Client指第三方应用,Resource Owner指用户,Authorization Server是我们的授权服务器,Resource Server是API服务器。
参考链接:http://blog.unvs.cn/archives/oauth-qq2.0-developer.html 以及新浪微博开放平台和新浪微博CodeProject开源项目
开发者可以先浏览OAuth2.0的接口文档,熟悉OAuth2的接口及参数的含义,然后我们根据应用场景各自说明如何使用OAuth2.0。
OAuth2 接口文档
| 接口 | 说明 |
|---|---|
| OAuth2/authorize | 请求用户授权Token |
| OAuth2/access_token | 获取授权过的Access Token |
| OAuth2/get_token_info | 授权信息查询接口 |
| OAuth2/revokeoauth2 | 授权回收接口 |
| OAuth2/get_oauth2_token | OAuth1.0的Access Token更换至OAuth2.0的Access Token |
二、OAuth2.0 新浪授权页
1、首先要获取appKey 和 appSecret,这个获取的方法可以从新浪微博新手指南 根据步骤一步一步的获取到。callBack地址这里采用默认的:https://api.weibo.com/oauth2/default.html,采用的是网站接入方式。下面是C#示例源码(控制台应用程序):
01.using System;
02.using System.Collections.Generic;
03.using System.Linq;
04.using System.Text;
05.using NetDimension.Weibo;
06.using System.Net;
07.
08.namespace SinaWeiboTestApp
09.{
10. class Program
11. {
12.
13. static void Main(string[] args)
14. {
15.
16. string appkey = "124543453288";
17. string appsecret = "3a456c5332fd2cb1178338fccb9fa51c";
18. //string callBack = "http://127.0.0.1:3170/WebSite2/Default.aspx";
19. string callBack = "https://api.weibo.com/oauth2/default.html";
20. var oauth = new NetDimension.Weibo.OAuth(appkey,appsecret,callBack);
21.
22. ////模拟登录
23. //string username = "xxxxxxxx@163.com";
24. //string password = "xxxxxxx";
25. //oauth.ClientLogin(username, password); //模拟登录下,没啥好说的,你也可以改成标准登录。
26.
27. //标准登录
28. var authUrl = oauth.GetAuthorizeURL();
29. //string redirectUrl;
30. //HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(authUrl);
31. //request.Referer = authUrl;
32. //request.AllowAutoRedirect = false;
33. //using (WebResponse response = request.GetResponse())
34. //{
35. // redirectUrl = response.Headers["Location"];
36. // redirectUrl = response.ResponseUri.AbsolutePath;
37. //}
38. System.Diagnostics.Process.Start(authUrl);
39. Console.WriteLine("填写浏览器地址中的Code参数:");
40. var code = Console.ReadLine();
41. var accessToken = oauth.GetAccessTokenByAuthorizationCode(code);
42. if (!string.IsNullOrEmpty(accessToken.Token))
43. {
44. var sina = new NetDimension.Weibo.Client(oauth);
45. var uid = sina.API.Dynamic.Account.GetUID(); //调用API中获取UID的方法
46. Console.WriteLine(uid);
47. }
48.
49. var Sina = new Client(oauth);
50. Console.WriteLine("开始发送异步请求...");
51.
52. //例子1:异步获取用户的ID
53. //demo的运行环境是.net 4.0,下面展示的这种方法在2.0及以上版本环境下有效,3.0以上可以用lambda表达式来简化delegate的蛋疼写法,请看下面的例子。
54. Sina.AsyncInvoke<string>(
55. //第一个代理中编写调用API接口的相关逻辑
56. delegate()
57. {
58. Console.WriteLine("发送请求来获得用户ID...");
59. System.Threading.Thread.Sleep(8000); //等待8秒
60. return Sina.API.Entity.Account.GetUID();
61. },
62. //第二个代理为回调函数,异步完成后将自动调用这个函数来处理结果。
63. delegate(AsyncCallback<string> callback)
64. {
65. if (callback.IsSuccess)
66. {
67. Console.WriteLine("获取用户ID成功,ID:{0}", callback.Data);
68. }
69. else
70. {
71. Console.WriteLine("获取用户ID失败,异常:{0}", callback.Error);
72. }
73. }
74. );
75.
76. //列子2:获取公共微博列表
77. //2.0以上用lambda来写,方便不是一点点
78. Sina.AsyncInvoke<NetDimension.Weibo.Entities.status.Collection>(() =>
79. {
80. //获取微博,接口调用,返回值是个NetDimension.Weibo.Entities.status.Collection,所以泛型T为NetDimension.Weibo.Entities.status.Collection
81. Console.WriteLine("发送请求来获得公共微博列表...");
82. return Sina.API.Entity.Statuses.PublicTimeline();
83. //return Sina.API.Entity.Statuses.RepostTimeline;
84. }, (callback) =>
85. {
86. if (callback.IsSuccess)
87. {
88. //异步完成后处理结果,result就是返回的结果,类型就是泛型所指定的NetDimension.Weibo.Entities.status.Collection
89. Console.WriteLine("获得公共微博列表成功,现在公共频道发微博的人都是他们:");
90. foreach (var status in callback.Data.Statuses)
91. {
92. if (status.User != null)
93. Console.WriteLine(status.User.ScreenName + " ");//打印公共微博发起人的姓名
94. }
95. Console.WriteLine();
96. }
97. else
98. {
99. Console.WriteLine("获取用户ID失败,异常:{0}", callback.Error);
100. }
101.
102. });
103.
104.
105. Console.WriteLine("已发送所有异步请求。等待异步执行完成...");
106.
107. Console.ReadKey(); //阻塞,等待异步调用执行完成
108.
109. }
110.
111. }
112.}
MVC中代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Myself.Models;
using Myself.Code;
using BLL;
using Lib;
using SpeexToWavToMp3;
using System.Web.Http.Filters;
using Models;
using Webdiyer.WebControls.Mvc;
using System.IO;
namespace Myself.Controllers
{
public class MySelfController : Controller
{
public ActionResult LoginSina()
{
var oauth = new NetDimension.Weibo.OAuth(appKey,appSecret,Url.Action("LoginSinaResult", "MySelf", null, "http"));
//第一步获取新浪授权页面的地址
var oauthUrl = oauth.GetAuthorizeURL();
return Redirect(oauthUrl);
}
public ActionResult LoginSinaResult(string code)
{
var oauth = new NetDimension.Weibo.OAuth(appKey, appSecret, Url.Action("LoginSinaResult", "MySelf", null, "http"));
var oauthToken = oauth.GetAccessTokenByAuthorizationCode(code);
var model = UserHelper.GetAuthorizeInfo(oauthToken.UID, 1);
if (model != null)
{
if (LoginHelper.UserLogin(model.UserID, 1, oauthToken.UID, Request.UserAgent, Request.UserHostAddress, "1", "web"))
{
return RedirectToAction("Index", "Home");
}
else
{
return Content("登录失败");
}
}
return Content("您尚未注册");
}
}
}
如果要运行上述程序的话,需要把Appkey和Appsecret给替换掉。
2、授权页面
下面的是提示微博登陆的界面,登陆后提供第三方网站授权访问你在新浪微博账号上的资源
3、授权访问页面
4、新浪官方网站提供API测试工具,用来测试客户端构造的参数是否正确
5、Oauth2.0运行流程图
第一步:首先直接跳转至用户授权地址,即图示 Request User Url ,提示用户进行登录,并给予相关资源授权,得到唯一的Auth code,这里注意的是code只有10分钟的有效期,对于安全考虑,相对于OAuth1.0省了一步获取临时的Token,并且有效期也进行了控制,比1.0认证简化了很多,并安全一些; 第二步:得到授权code后,这一步就是请求access token,通过 图示 Request access url ,生成得到数据Token; 第三步:通过Access Token请求OpenID,openid是用户在此平台的唯一标识,通过 图示 Request info url 请求,然后得到OpenID; 第四步:通过第二步得到的数据Token、第三步得到的OpenID及相关API,进行请求,获取用户授权资源信息
Oauth2认证以及新浪微博开放平台应用的更多相关文章
- iOS5.0以上使用新浪微博开放平台OAuth 续(及解决登录无效问题)
新浪微博开放平台为第三方应用提供了简便的合作模式,满足了手机用户和平板电脑用户随时随地分享信息的需求.通过调用平台的api即可实现很多微博上的功能. 本篇主要目的是记录新浪微博移动SDK iOS版本的 ...
- 新浪微博开放平台OAuth授权解决方案(含代码)
前几日一位朋友项目中需要使用新浪微博的接口,故和这位朋友一同研究了新浪微博开放平台上面所提供的资料,首先要使用这些接口是需要用户登录并且授权的,新浪微博开放平台其实是提供两种授权方式的,第一种是:OA ...
- 新浪微博开放平台开发-android客户端(1)【转】
http://www.cnblogs.com/virusswb/archive/2011/08/05/2128941.html 最近不是太忙,花了一些时间学习android的应用开发.经过两个星期的学 ...
- DevStore开发人员服务有奖征文:小谈新浪微博开放平台
DevStore开发人员服务有奖征文:小谈新浪微博开放平台 笔者接入新浪微博开发平台也有一段时间了,对整个平台的接入也算比較熟悉,新浪提供了统一的API接口,能够让开发人员更方便的使用API来实现自己 ...
- IOS基于新浪微博开放平台微博APP
1.基于新浪微博开放平台APP源码 2.gitHub源代码下载地址 https://github.com/whzhaochao/SinaWeiBoOpen 3.用到的第三放开源库 3.1 RTLab ...
- 新浪微博开放平台之OAuth2.0认证
1.先到开放平台创建一个移动应用.获得key和secret,接着到"应用信息"里面填写授权回调页的网址,该网址能够随意,可是必须是能訪问的. 2.通过新浪提供的api:https: ...
- apigw鉴权分析(1-4)新浪微博开放平台 - 鉴权分析
一.访问入口 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E 微博开放接口的调用,如 ...
- 新浪微博开放平台账号申请(基于dcloud开发)
注意事项: 1.新浪微博不仅需要appkey和appsecret,而且还需要回调的url,这个链接是可以随便写的,但是需要和在开放平台申请的一致. 2. Android签名包信息部分 (1.)首先安卓 ...
- PHP学习之[第11讲]新浪微博开放平台 PHP 与 OAuth 接口(1)
我是下载的微博最新的API练习了一下认证过程.
随机推荐
- 点击返回键退出popupwindow的方法
点击返回键退出popupwindow mPopupWindow.setFocusable(true); 这句非常重要,对背景不会有影响 mPopupWindow.setBackgroundDrawab ...
- 如何把UIView转成UIImage,解决模糊失真问题
最近工作中,遇到一个需求,需要把一个UIView对象转成UIImage对象显示.经过网络搜索,找到如下答案: ? 1 2 3 4 5 6 7 8 -(UIImage*)convertViewToIma ...
- 【Java基础】可变参数
下面是一个简单的小程序: import java.util.Arrays; class lesson6 { public static void main(String[] args) { ,,,,, ...
- sql server去除重复信息,
SELECT st_id FROM ( SELECT *,ROW_NUMBER() OVER( PARTITION BY st_code ORDER BY st_code ) AS num FROM ...
- Hello World 老调重谈
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine( ...
- UMl概述(转)
1. UML的组成 UML由视图(View).图(Diagram).模型元素(Model Element)和通用机制(General Mechanism)等几个部分组成. a) 视图(View): 是 ...
- hadoop python and Twitter
http://www.wubiaoblog.com/archives/1159 http://blog.csdn.net/anbo724 http://f.dataguru.cn/forum.php? ...
- js 进阶笔记
JS中substr和substring的用法和区别 substr和substring都是JS截取字符串函数,两者用法很相近, substr方法 返回一个从指定位置开始的指定长度的子字符串. strin ...
- android spinner 每行字体颜色都变化
final static int[] COLOR_LIST={Color.WHITE,Color.WHITE,Color.GRAY,Color.YELLOW,Color.RED}; spinner=( ...
- C语言中宏定义(#define)时do{}while(0)的价值(转)
C语言中宏定义(#define)时do{}while(0)的价值 最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总 ...