如何注销oauth当前授权用户?求代码

 我来答
huanglenzhi
2014-12-16 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517195
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
  其实在程序中步骤表现就只有4步:
  1、获取Request token。
  2、用户认证。
  3、获取Access token。
  4、获取用户信息。
  在处理OAuth授权过程中我也碰到几个在新浪开放平台论坛中常见的几个问题,在这里总结下,在后面讲解中会讲到我的想法和解决办法:
  1、requesttoken时callback问题。
  2、401错误。
  3、403错误。
  4、500错误。
  5、未经授权错误。
  在这里顺便讲一下调用新浪微博接口必须是要申请一个应用的,申请应用成功之后会得到一个App key号和App Secret号,我们也需要通过这两个参数来请求授权,还有就是网上有OAuthBase下载,但是要下对版本,我的Demo中也有,我们的授权主要的代码是在OAuthBase.cs文件中的。
  1、获取Request token:
  直接上代码:
  public void getRequestToken()
  {
  Uri uri = new Uri(requestTokenUri);
  string nonce = oAuth.GenerateNonce();//获取随机生成的字符串,防止攻击
  string timeStamp = oAuth.GenerateTimeStamp();//发起请求的时间戳
  string normalizeUrl, normalizedRequestParameters;
  // 签名
  string sig = oAuth.GenerateSignature(uri, apiKey, apiKeySecret, string.Empty, string.Empty,
  "GET", timeStamp, nonce, string.Empty, out normalizeUrl, out normalizedRequestParameters);
  sig = HttpUtility.UrlEncode(sig);
  //构造请求Request Token的url
  StringBuilder sb = new StringBuilder(uri.ToString());
  sb.AppendFormat("?oauth_consumer_key={0}&", apiKey);
  sb.AppendFormat("oauth_nonce={0}&", nonce);
  sb.AppendFormat("oauth_signature={0}&", sig);
  sb.AppendFormat("oauth_signature_method={0}&", "HMAC-SHA1");
  sb.AppendFormat("oauth_timestamp={0}&", timeStamp);
  sb.AppendFormat("oauth_version={0}", "1.0");
  //请求Request Token
  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sb.ToString());
  HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  StreamReader stream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);
  string responseBody = stream.ReadToEnd();
  stream.Close();
  response.Close();
  int intOTS = responseBody.IndexOf("oauth_token=");
  int intOTSS = responseBody.IndexOf("&oauth_token_secret=");
  Session["oauth_token"] = responseBody.Substring(intOTS + 12, intOTSS - (intOTS + 12));
  Session["oauth_token_secret"] = responseBody.Substring((intOTSS + 20), responseBody.Length - (intOTSS + 20));
  Response.Redirect(AUTHORIZE + "?oauth_token=" + Session["oauth_token"] + "&oauth_callback=" + Request.Url);
  }

  我在请求Request token的时候遇到了401错误和地址返回错误,地址返回错误比较好解决,一般都是地址错误,所以我直接用了Request.Url,那么401错误了我出错是在签名 的地方,最开始的OAuthBase文件下载错了,下给最新的就可以了,还有就是在请求参数中的oauth_version参数,有很多值是1.0a,这样好像是不行的,全部改成1.0就能避免很多错误。

  2、用户认证:
  在Request token请求成功之后,平台自动跳到登录页面,进行用户认证,认证通过之后平台会将oauth_token和oauth_verifier返回到指定的callback来,将两个参数保存下来用于请求Access token,在这里如果地址不正确是会报错的。
  3、获取Access token:
  这个请求的重点还是在签名,必须要将用户认证后返回的oauth_token和oauth_verifier一并签名才能正确,有些OAuthBase中是没有将verifier加入签名当中当时让我好生郁闷,如果这点错了应该会报未经授权或者403错误,请求成功之后需要将oauth_token和oauth_token_secret重新保存下,下面是代码:
  public void getAccessToken(string requestToken, string oauth_verifier)
  {
  Uri uri = new Uri(ACCESS_TOKEN);
  string nonce = oAuth.GenerateNonce();
  string timeStamp = oAuth.GenerateTimeStamp();
  string normalizeUrl, normalizedRequestParameters;
  // 签名
  string sig = oAuth.GenerateSignature(
  uri,
  apiKey,
  apiKeySecret,
  requestToken,
  Session["oauth_token_secret"].ToString(),
  "Get",
  timeStamp,
  nonce,
  oauth_verifier,
  out normalizeUrl,
  out normalizedRequestParameters);
  sig = oAuth.UrlEncode(sig);
  //构造请求Access Token的url
  StringBuilder sb = new StringBuilder(uri.ToString());
  sb.AppendFormat("?oauth_consumer_key={0}&", apiKey);
  sb.AppendFormat("oauth_nonce={0}&", nonce);
  sb.AppendFormat("oauth_timestamp={0}&", timeStamp);
  sb.AppendFormat("oauth_signature_method={0}&", "HMAC-SHA1");
  sb.AppendFormat("oauth_version={0}&", "1.0");
  sb.AppendFormat("oauth_signature={0}&", sig);
  sb.AppendFormat("oauth_token={0}&", requestToken);
  sb.AppendFormat("oauth_verifier={0}", oauth_verifier);
  //请求Access Token
  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sb.ToString());
  HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  StreamReader stream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);
  string responseBody = stream.ReadToEnd();
  stream.Close();
  response.Close();
  int intOTS = responseBody.IndexOf("oauth_token=");
  int intOTSS = responseBody.IndexOf("&oauth_token_secret=");
  int intUser = responseBody.IndexOf("&user_id=");
  Session["oauth_token"] = responseBody.Substring(intOTS + 12, intOTSS - (intOTS + 12));
  Session["oauth_token_secret"] = responseBody.Substring((intOTSS + 20), intUser - (intOTSS + 20));
  Session["User_Id"] = responseBody.Substring((intUser + 9), responseBody.Length - (intUser + 9));
  verify_credentials();
  }

  4、获取登录用户信息:
  步骤简单和以上几个请求方式也一样,主要是要将oauth_token和oauth_token_secret加入签名,下面是代码:
  public void verify_credentials()
  {
  Uri uri = new Uri("url");
  string nonce = oAuth.GenerateNonce();
  string timeStamp = oAuth.GenerateTimeStamp();
  string normalizeUrl, normalizedRequestParameters;
  // 签名
  string sig = oAuth.GenerateSignature(
  uri,
  apiKey,
  apiKeySecret,
  Session["oauth_token"].ToString(),
  Session["oauth_token_secret"].ToString(),
  "Get",
  timeStamp,
  nonce,
  string.Empty,
  out normalizeUrl,
  out normalizedRequestParameters);
  sig = HttpUtility.UrlEncode(sig);
  StringBuilder sb = new StringBuilder(uri.ToString());
  sb.AppendFormat("?oauth_consumer_key={0}&", apiKey);
  sb.AppendFormat("oauth_nonce={0}&", nonce);
  sb.AppendFormat("oauth_timestamp={0}&", timeStamp);
  sb.AppendFormat("oauth_signature_method={0}&", "HMAC-SHA1");
  sb.AppendFormat("oauth_version={0}&", "1.0");
  sb.AppendFormat("oauth_signature={0}&", sig);
  sb.AppendFormat("oauth_token={0}&", Session["oauth_token"].ToString());
  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sb.ToString());
  HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  StreamReader stream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);
  string responseBody = stream.ReadToEnd();
  stream.Close();
  response.Close();
  Session["responseBody"] = responseBody;
  }

  到这里你可以获取用户的个人信息,那么OAuth授权也就成功,其实步骤是比较简单的,主要要注意的就是签名,签名不正确一定是通过不了的,还有就是一些细节,如地址,版本号,请求方式这些细心点就能避免,由于时间原因这里讲的比较简单,希望大家互相交流下,这里是Demo:SinaOAuth
  转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式