标签:
本文主要介绍和xero OAuth的集成过程,以后再与其他第三方的OAuth的集成过程也将类似。 另外由于xero官方的文档非常有限,因此有必要进行总结一下。http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
http://baike.baidu.com/view/6619164.htm
public class XeroApiAdapter
{
private readonly IXeroApiParameter _parameter;
private const string PARTNER_URL = "https://api-partner.network.xero.com";
private const string BASE_URL = "https://api.xero.com";
public XeroCoreApi CoreApi { get; private set; }
private readonly X509Certificate2 _signingCertificate;
private readonly X509Certificate2 _partnerCertificate;
/// <summary>
///
/// </summary>
/// <param name="parameter"></param>
public XeroApiAdapter(IXeroApiParameter parameter)
{
_signingCertificate = XeroOAuthSettings.Fetch.SigningCertificate.SelectedCertificate;
if (_signingCertificate == null)
{
throw new Exception("Signing certificate must be defined");
}
_partnerCertificate = XeroOAuthSettings.Fetch.PartnerCertificate.SelectedCertificate;
if (_partnerCertificate == null)
{
throw new Exception("partner certificate must be defined");
}
_parameter = parameter;
var user = new ApiUser { OrganisationId = parameter.NetworkId, Name = parameter.NetworkId };
CoreApi = new XeroCoreApi(PARTNER_URL,
new RuPartnerAuthethicator(PARTNER_URL, BASE_URL, XeroTokenServices.Do,
_signingCertificate, _partnerCertificate),
new Consumer(parameter.ConsumerKey, parameter.ConsumerSecret), user,
new DefaultMapper(), new DefaultMapper());
}
public PartnerMvcAuthenticator MvcAuthenticator(string callBack)
{
return new PartnerMvcAuthenticator(PARTNER_URL, BASE_URL, callBack, XeroTokenServices.Do,
_signingCertificate, _partnerCertificate,
new Consumer(_parameter.ConsumerKey, _parameter.ConsumerSecret),
XeroRequestTokenServices.Do);
}
}public class RuPartnerAuthethicator : PartnerAuthenticator
{
public RuPartnerAuthethicator(string baseUri, string authorizeUri, ITokenStore store, string signingCertificatePath, string certificatePath, string password) : base(baseUri, authorizeUri, "", store, signingCertificatePath, certificatePath, password)
{
}
public RuPartnerAuthethicator(string baseUri, string authorizeUri, ITokenStore store, X509Certificate2 signingCertificate, X509Certificate2 certificate) : base(baseUri, authorizeUri, "", store, signingCertificate, certificate)
{
}
protected override string AuthorizeUser(IToken token)
{
throw new XeroRenewAccessTokenException("Please renew access token");
}
} public class XeroTokenServices : MongoService, ITokenStore
{
public static XeroTokenServices Do
{
get
{
return new XeroTokenServices();
}
}
private XeroTokenServices()
{
}
private MongoCollection<MDXeroToken> XeroTokenStore
{
get
{
return Connection.GetMongoCollection<MDXeroToken>("XeroTokenStore");
}
}
public void Add(IToken token)
{
//Lets delete first as we are not sure if Xero have a delete
Delete(token);
XeroTokenStore.Save(new MDXeroToken(token));
}
public void Delete(IToken token)
{
XeroTokenStore.Remove(Query<MDXeroToken>.EQ(x => x.UserId, token.UserId));
}
public IToken Find(string user)
{
var token = XeroTokenStore.FindOne(Query<MDXeroToken>.EQ(x => x.UserId, user));
return token;
}
public void ClearTokenForNetwork(string id)
{
XeroTokenStore.Remove(Query<MDXeroToken>.EQ(x => x.UserId, id));
}
}
public class XeroRequestTokenServices : MongoService, ITokenStore
{
public static XeroRequestTokenServices Do
{
get { return new XeroRequestTokenServices(); }
}
private XeroRequestTokenServices()
{
}
private MongoCollection<MDXeroToken> XeroTokenStore
{
get
{
return Connection.GetMongoCollection<MDXeroToken>("XeroRequestTokenStore");
}
}
public void Add(IToken token)
{
//Lets delete first as we are not sure if Xero have a delete
Delete(token);
XeroTokenStore.Save(new MDXeroToken(token));
}
public void Delete(IToken token)
{
XeroTokenStore.Remove(Query<MDXeroToken>.EQ(x => x.UserId, token.UserId));
}
public IToken Find(string user)
{
return XeroTokenStore.FindOne(Query<MDXeroToken>.EQ(x => x.UserId, user));
}
public void ClearTokenForNetwork(string id)
{
XeroTokenStore.Remove(Query<MDXeroToken>.EQ(x => x.UserId, id));
}
}4. 指定callback 函数, 在xero配置callback domain
4.1 添加Application
4.2 配置call back domain , 生成key , secret
public ActionResult Authorize(string oauth_token, string oauth_verifier, string org, string redirect)
{
var network = NetworksManagment.Do.GetNetwork(Tenant.NetworkId);
var xeroApi = new XeroApiAdapter(new XeroApiParam(network));
var authenthicator = xeroApi.MvcAuthenticator("");
try
{
// - call XeroTokenServices.Add and store the token in MDXeroToken
var token = authenthicator.RetrieveAndStoreAccessToken(network.Id, oauth_token, oauth_verifier, org);
var organization = xeroApi.CoreApi.Organisation;
...
TempData.AddNotification(NotifcationType.Success, "Xero connected successfully");
}
catch (Exception ex)
{
TempData.AddNotification("Error connecting to Xero", ex);
}
if (string.IsNullOrEmpty(redirect))
{
return RedirectToAction("Index");
}
return Redirect(redirect);
}版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/lan_liang/article/details/48579699