使用C# 与Xero OAuth 交互 集成

本文主要介绍和xero OAuth的集成过程,以后再与其他第三方的OAuth的集成过程也将类似。 另外由于xero官方的文档非常有限,因此有必要进行总结一下。
Xero 是一个财务系统,可用于替代产品账单模块的实现。
www.xero.com

了解OAuth :

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

http://baike.baidu.com/view/6619164.htm

概括起来就是,对于SystemA用户要访问systemB的资源,sysB的用户可以指定将SysB中的哪些部分(模块)暴露出来给SysA进行访问,同时会给sysA一个token和证书。每次sysA访问sysB时需要带上token以及证书。

1. 安装 nuget pkg :

2. 创建wapper 来封装交互过程

前提:
1.需要已经安装证书
2.已经得到了key/secret

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);
        }

    }

RuPartnerAuthethicator.cs (主要用于over write xero de AuthorizeUser函数,默认会打开浏览器):

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");
        }
    }

3. 实现IToken 接口,分为Request Token和 Access Token。 即请求token和访问token,访问token需要做持久化,请求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

4.3 Call back 函数:

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);
        }

xero 官方 git:

https://github.com/XeroAPI/Xero-Net

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 01:57:45

使用C# 与Xero OAuth 交互 集成的相关文章

人工智能交互集成在线语音合成能力的Tips

在线语音合成就是在联网的场景下将文字转换成声音,实现机器向人的声音交互.这个概念应该是比较好理解的,下面就结合官网的Android在线合成的Demo讲解一下合成的流程以及大家经常遇到的一些问题. 到官网SDK下载中心下载在线命令词识别SDK(这里以Android版本为例)后,可以发现压缩包里面的目录结构和听写的非常类似,这里告诉大家一个小秘密: 在官网下载Android的这三个选项下载的SDK包是一模一样的,为什么会这样呢?因为听写.在线合成.在线命令词三个功能在我们平台是放在一个SDK 包里的

集成基于OAuth协议的单点登陆

在之前的一篇文章中,我们已经介绍了如何为一个应用添加对CAS协议的支持,进而使得我们的应用可以与所有基于CAS协议的单点登陆服务通讯.但是现在的单点登陆服务实际上并不全是通过实现CAS协议来完成的.例如Google就使用OAuth协议来管理它的帐户. 相较于CAS协议,OAuth协议不仅仅可以完成对用户凭证的验证,更可以提供权限管理的功能.在这些权限管理功能的支持下,一个应用甚至可以访问其它使用相同OAuth服务的应用的数据,从而完成应用间的交互. OAuth集成示例 现在我们就来看一个通过OA

软件測试基本方法(六)之集成測试和系统測试

在软件开发中.常常会遇到这种情况.单元測试时确认每一个模块都能单独工作,但这些模块集成在一起之后会出现有些模块不能正常工作.比如,在chrome环境下用js写了一个实时捕捉video中特定区域的模块,正常工作:利用worker线程进行webgl场景渲染,也正常.但是当两个运算合并时.出现一个模块不能正常执行,原因在于两个模块不适合在worker线程中结合.基于worker本身的局限性,仅仅能有一个模块正常工作. 所以,非常有必要进行集成測试. (1)集成測试定义: 集成測试是将软件集成起来,对模

IBM ODM规则服务集成的最佳实践

企业IT架构中,我们通常会将规则引擎作为一个独立的服务,供企业中的不同应用消费,这也和当前一切皆服务的SOA思想吻合.那么问题来了,规则服务以什么形式部署呢?怎样和应用交互集成呢?Webservice? 好吧,这是一个标准答案,并且也是一个差不多正确的答案,但我们还有更多需要考虑的东西. 我曾在一个保险行业客户处看到这样一个设计:客户设计了一个webservice,用于定义核保的输入输出,然后定义了一个EJB服务来包装规则服务,供webservice调用,在该EJB的实现中,再调用ODM自带的E

前端工具集合

前端组织 虽混过外企俩家,但劳资英文这项的技能点还是灰色的...so,俺关注的站点主要以中文为主 名称 推荐指数 备注/说明 Git ★★★★★ 劳资清楚这不是个纯粹的前端社区... 但作为全球最大的搞基社区,无数前端项目在这启航 没Git都不好意思面基有木有! MDN ★★★★★ 不解释,无数的资源再等着你探索 Awesomes.cn ★★★★☆ 国人维护的前端资源库,深度对接到 Github 慕课 ★★★★☆ 大量的在线计算机课程. 虽然初.中级居多,但是不乏有巨作值得细细品尝 W3Cplu

大前端工具集

来自:https://github.com/nieweidong/fetool 作者: 微博 @聂微东 个人 Blog fefork.com 博客园 犀利的东哥   目录 前端组织/前端博客 博客搭建 HTML CSS 浏览端 JS Project Build Node Package Node Project 精选阅读 前端技术 Node 学习资料 前端面试 其他技术 工具/软件 Web APP Mac Linux Chrome Plugins Git 服务端 数据端 设计/交互 速查手册 杂

使用 Spring Security 保护 Web 应用的安全

使用 Spring Security 保护 Web 应用的安全 安全一直是 Web 应用开发中非常重要的一个方面.从安全的角度来说,需要考虑用户认证和授权两个方面.为 Web 应用增加安全方面的能力并非一件简单的事情,需要考虑不同的认证和授权机制.Spring Security 为使用 Spring 框架的 Web 应用提供了良好的支持.本文将详细介绍如何使用 Spring Security 框架为 Web 应用提供安全支持. 4 评论: 成 富, 软件工程师, IBM 中国软件开发中心 201

iOS 第三方库、插件、知名博客总结

用到的组件1.通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SDWebImage多个缩略图缓存组件 UICKeyChainStore存放用户账号密码组件 Reachability监测网络状态 DateTools友好化时间 MBProgressHUD一款提示框第三方库 MWPhotoBrowser一款简单的 iOS 照片浏览控件 CTAssetsPickerController一个选择器组件, 支持从用户的相片库选择多张照片和视频. QB

Office 365也是.NET Core应用开发新战场

最近有幸阅读了陈希章花了一年时间为国内开发者贡献的<Office 365 开发入门指南>. 虽然早期接触过SharePoint的开发,2007年之后就再也没有接触SharePoint的开发,这次阅读这本书让我重新认识了Office的系统开发技术,让我意识到现在的Office 开发也是.NET Core 开发技术的新战场,而且更为有心的是陈希章的范例都是使用.NET Core写的,具体地址 https://github.com/chenxizhang/office365dev. 在新CEO纳德拉