この記事では主に 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 にはトークンと証明書が与えられます。 sysA が sysB にアクセスするたびに、トークンと証明書を取得する必要があります。 nuget PKGをインストールします。 cs (主に xero de AuthorizeUser 関数の上書きに使用され、デフォルトでブラウザが開きます):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);
}
}
3. リクエスト トークンとアクセス トークンに分かれている IToken インターフェイスを実装します。 つまり、リクエスト トークンとアクセス トークンは永続化する必要があり、リクエスト トークンはメモリに保存できます。 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");
}
}
4. xeroでコールバック関数を指定し、コールバックドメインを設定する
4.1 アプリケーションを追加する
4.2 コールバックドメインを設定し、キー、シークレットを生成する
4.3コールバック機能:
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)); } }
xero 公式 git: https://github.com/XeroAPI/Xero-Net
上記は、C# を使用した Xero OAuth との対話型統合の内容です。さらに関連する内容については、PHP に注目してください。中国語のウェブサイト (www.php .cn)!