链接 在 c# 中的当前状态更新中,收到错误 (401) 未经授权
本文关键字:错误 授权 更新 状态 链接 | 更新日期: 2023-09-27 18:36:59
基本上我想将AccessToken,AccessTokenSecret和Verifier保存在数据库中,当我想代表用户在"链接"中发布状态更新时,我可以。
第一次获取这些访问令牌,然后使用它,我可以成功更新状态。但是我存储了它,然后在 20-30 分钟后,如果我尝试使用该存储的令牌进行相同的更新状态调用,则会出现 401 错误。
存储令牌并稍后使用是正确的方法吗?还是每次用户需要显示允许权限屏幕并且必须获取新令牌时?
下面是我的函数。 我正在使用这个库
public string makeRequestForStatusUpdateOnLinkedIn(String txtAccessToken, String txtAccessTokenSecret, String txtoAuth_verifier,String status)
{
private oAuthLinkedIn _oauth = new oAuthLinkedIn()
_oauth.Token = txtAccessToken;
_oauth.TokenSecret = txtAccessTokenSecret;
_oauth.Verifier = txtoAuth_verifier;
string xml = "<?xml version='"1.0'" encoding='"UTF-8'"?>";
xml += "<current-status>" + status + ".</current-status>";
string response = _oauth.APIWebRequest("PUT", "http://api.linkedin.com/v1/people/~/current-status", xml);
if (response == "")
return "Your new status updated successfully !";
else
{
return "Sorry ! Error at server side!";
}
}
最后不使用任何其他库。我只是按照LinkedIn文档的步骤进行操作,然后得到我想要的。下面是解决我的问题的代码,可能会帮助其他人。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Newtonsoft.Json.Linq;
using OAuth2;
namespace WebApplication2
{
public partial class SamplePage : System.Web.UI.Page
{
public enum Method { GET, POST, PUT, DELETE };
public const String apikey = "YOURAPP_API_KEY";
public const String Secretkey = "YOUR_APP_SECRETKEY";
public const String linkedInPeapleURL = "https://api.linkedin.com/v1/people/~";
public const String generateAuthorizationCode = "https://www.linkedin.com/uas/oauth2/authorization?response_type=code";
public const String state= "qwertyytrewq123";
public const String redirectURI = "http://localhost:17681/SamplePage.aspx";
public const String generateAccessToeknURL = "https://www.linkedin.com/uas/oauth2/accessToken?grant_type=authorization_code";
public String code="";
public const String useAccessToeknURL = "https://api.linkedin.com/v1/people/~?oauth2_access_token=";
public const String scope = "r_basicprofile";// r_fullprofile r_emailaddress r_network r_contactinfo rw_nusrw_groups w_messages";
// OR SET permission while create Application in linked in
public String AccessToken;
protected void Page_Load(object sender, EventArgs e)
{
//Redirect
string url = getAuthorizationURL();
// url=HttpUtility.UrlEncode(url);
//WebRequest(Method.GET, url, "");
if (Request.QueryString["code"] == null)
{
Response.Redirect(url, true);
}
else
{
code = Request.QueryString["code"];
String response = WebRequest(Method.GET, getAccessToeknURL(), "");
JObject jobj = JObject.Parse(response);
AccessToken = jobj["access_token"].ToString();
response = WebRequest(Method.GET, linkedInPeapleURL+ "?oauth2_access_token=" + AccessToken, ""); // get basic detail
// response = WebRequest(Method.GET, linkedInPeapleURL + "/email-address" + "?oauth2_access_token=" + AccessToken, ""); // get Email id
//GET Request
}
// POST request
//GET Request
}
public string getAccessToeknURL()
{
String url = "";
url = generateAccessToeknURL + "&code=" + code + "&redirect_uri=" + redirectURI + "&client_id=" + apikey + "&client_secret=" + Secretkey;
return url;
}
private String getAuthorizationURL()
{
String response = generateAuthorizationCode + "&client_id=" + apikey +"&state=" + state + "&redirect_uri=" + redirectURI;
return response;
}
public string WebRequest(Method method, string url, string postData)
{
HttpWebRequest webRequest = null;
StreamWriter requestWriter = null;
string responseData = "";
webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest;
webRequest.Method = method.ToString();
webRequest.ServicePoint.Expect100Continue = false;
//webRequest.UserAgent = "Identify your application please.";
//webRequest.Timeout = 20000;
if (method == Method.POST)
{
webRequest.ContentType = "application/x-www-form-urlencoded";
//POST the data.
requestWriter = new StreamWriter(webRequest.GetRequestStream());
try
{
requestWriter.Write(postData);
}
catch
{
throw;
}
finally
{
requestWriter.Close();
requestWriter = null;
}
}
//webRequest.ContentType = "text/plain";
responseData = WebResponseGet(webRequest);
webRequest = null;
return responseData;
}
public string WebResponseGet(HttpWebRequest webRequest)
{
StreamReader responseReader = null;
string responseData = "";
try
{
responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
responseData = responseReader.ReadToEnd();
}
catch
{
throw;
}
finally
{
webRequest.GetResponse().GetResponseStream().Close();
responseReader.Close();
responseReader = null;
}
return responseData;
}
}
}
请尝试此代码
protected void Page_Load(object sender, EventArgs e)
{
// create from config file
var config = LinkedInApiConfiguration.FromAppSettings("LogiDemo.LinkedInConnect");
// or manually
// var config = LinkedInApiConfiguration("api key", "api secret key");
// get the APIs client
var api = new LinkedInApi(config);
var scope = AuthorizationScope.ReadBasicProfile | AuthorizationScope.ReadEmailAddress;
var state = Guid.NewGuid().ToString();
var redirectUrl = "http://localhost:49965/WebForm1.aspx";
var url = api.OAuth2.GetAuthorizationUrl(scope, state, redirectUrl);
Response.Redirect(url.OriginalString);
}
参考文章: http://blog.logiticks.com/post/2015/06/28/how-to-retrieve-all-possible-information-about-a-linkedin-account-using-asp-net-c