项目作者: GovTechSG

项目描述 :
🔑 C# helper utility that sign HTTP Authorization Scheme for API authentication
高级语言: C#
项目地址: git://github.com/GovTechSG/csharp-apex-api-security.git
创建时间: 2017-10-30T09:21:43Z
项目社区:https://github.com/GovTechSG/csharp-apex-api-security

开源协议:MIT License

下载


APEX API C# Security Utility

Build Status
PRs Welcome
MIT License

A C# helper utility that construct and sign HTTP Authorization header scheme for API authentication and verification.

Table of Contents

Getting Started

Prerequisites

  • .NET Framework 4.6.1
  • Visual Studio 2019 Community
  • NUnit Framework 3.13+

Make sure that all unit test cases are passed before using the library.

Installing NUnit (Important : Windows Only)

For windows users , NUnitTestAdapter have to be installed before you can run the test cases succcessfully.

  1. From Tools menu, use Library Package Manager and select Manage NuGet packages for solution.

  2. In the left panel, select Online

  3. Locate (search for) NUnit 3.0 Test Adapter in the center panel and highlight it

  4. Click install, and select existing project ApiSecuritySolution to add the adapter.

Using the QueryData and FormData Class

The ApiUtilLib Library provide the utility class QueryData to construct request Query String and Form Data.

Generate QueryString

  1. var queryData = new QueryData();
  2. queryData.Add("clientId", "1256-1231-4598");
  3. queryData.Add("accountStatus", "active");
  4. queryData.Add("txnDate", "2017-09-29");
  5. string queryString = queryData.ToString();
  6. string baseUrl = string.Format("https://example.com/resource{0}", queryString);
  7. // https://example.com/resource?clientId=1256-1231-4598&accountStatus=active&txnDate=2017-09-29

Generate FormData

  1. var formData = new FormData();
  2. formData.Add("phoneNo", "+1 1234 4567 890");
  3. formData.Add("street", "Hellowood Street");
  4. formData.Add("state", "AP");
  5. string formData = formData.ToString();
  6. // phoneNo=%2B1+1234+4567+890&street=Hellowood+Street&state=AP

NOTE

For formData parameter used for Signature generation, the key value parameters do not need to be URL encoded,
When you use this client library method ApiAuthorization.HttpRequest, it will do the url-encoding during the HTTP call

How to Generate L1 Authorization Header

  1. public void L1Sample()
  2. {
  3. var URL = "https://{gatewayName}.api.gov.sg/api/v1/resource";
  4. var APP_NAME = "{appName}";
  5. var APP_SECRET = "{appSecret}";
  6. // prepare form data
  7. var formData = new FormData();
  8. formData.Add("q", "how to validate signature in pdf");
  9. formData.Add("ei", "yAr8YLmwCM_Fz7sPsKmLoAU");
  10. var authParam = new AuthParam()
  11. {
  12. url = new Uri($"{URL}"),
  13. httpMethod = HttpMethod.POST,
  14. appName = APP_NAME,
  15. appSecret = APP_SECRET,
  16. formData = formData
  17. };
  18. // get the authorization token for L1
  19. var authToken = ApiAuthorization.TokenV2(authParam);
  20. Console.WriteLine($"\n>>> BaseString :: '{authToken.BaseString}'<<<");
  21. Console.WriteLine($"\n>>> Authorization Token :: '{authToken.Token}'<<<");
  22. // make api call with authToken.Token
  23. }

Supported Private Key File Type

  1. .pem/.key - pkcs#1 base64 encoded text file
  2. .pem/.key - pkcs#8 base64 encoded text file
  3. .p12/.pfx - pkcs#12 key store

How to Generate L2 Authorization Header

  1. public void L2Sample()
  2. {
  3. var URL = "https://{gatewayName}.api.gov.sg/api/v1/resource";
  4. var APP_NAME = "{appName}";
  5. var PRIVATE_KEY_FILE_NAME = "privateKey.key";
  6. var PRIVATE_KEY_PASSPHRASE = "{passphrase}";
  7. // get the private key from pem file (in pkcs1 format)
  8. var privateKey = ApiAuthorization.GetPrivateKey(PRIVATE_KEY_FILE_NAME, PRIVATE_KEY_PASSPHRASE);
  9. // prepare queryString
  10. var queryData = new QueryData();
  11. queryData.Add("view", "net-5.0");
  12. queryData.Add("system", "C# sample code");
  13. // get url safe querystring from ToString()
  14. Console.WriteLine($">>> Query String >>>{queryData.ToString()}<<<");
  15. // prepare form data
  16. var formData = new FormData();
  17. formData.Add("name", "peter pan");
  18. formData.Add("age", "12");
  19. var authParam = new AuthParam()
  20. {
  21. url = new Uri($"{URL}{queryData.ToString()}"),
  22. httpMethod = HttpMethod.POST,
  23. appName = APP_NAME,
  24. privateKey = privateKey,
  25. formData = formData
  26. };
  27. // get the authorization token for L1
  28. var authToken = ApiAuthorization.TokenV2(authParam);
  29. Console.WriteLine($"\n>>> BaseString :: '{authToken.BaseString}'<<<");
  30. Console.WriteLine($"\n>>> Authorization Token :: '{authToken.Token}'<<<");
  31. // make api call with authToken.Token
  32. }

How to Generate L21 Authorization Header

(for cross zone api from internet to intranet)

  1. public void L21Sample()
  2. {
  3. var URL_WWW = "https://{www_gatewayName}.api.gov.sg/api/v1/resource";
  4. var APP_NAME_WWW = "www_appName";
  5. var PRIVATE_KEY_FILE_NAME = "www_privateKey.key");
  6. var PRIVATE_KEY_PASSPHRASE = "{password}";
  7. var URL_WOG = "https://{wog_gatewayName}.api.gov.sg/api/v1/resource";
  8. var APP_NAME_WOG = "{wog_AppName}";
  9. var APP_SECRET_WOG = "{wog_appSecret}";
  10. // get the private key from pem file (in pkcs1 format)
  11. var privateKey = ApiAuthorization.GetPrivateKey(PRIVATE_KEY_FILE_NAME, PRIVATE_KEY_PASSPHRASE);
  12. // prepare queryString
  13. var queryData = new QueryData();
  14. queryData.Add("view", "net-5.0");
  15. queryData.Add("system", "C# sample code");
  16. // prepare form data
  17. var formData = new FormData();
  18. formData.Add("name", "peter pan");
  19. formData.Add("age", "12");
  20. // prepare the parameters
  21. var authParam = new AuthParam()
  22. {
  23. url = new Uri($"{URL_WWW}{queryData.ToString()}"),
  24. httpMethod = HttpMethod.POST,
  25. appName = APP_NAME_WWW,
  26. privateKey = privateKey,
  27. formData = formData,
  28. nextHop = new AuthParam()
  29. {
  30. url = new Uri($"{URL_WOG}{queryData.ToString()}"),
  31. appName = APP_NAME_WOG,
  32. appSecret = APP_SECRET_WOG
  33. }
  34. };
  35. // get the authorization token for L21
  36. var authToken = ApiAuthorization.TokenV2(authParam);
  37. Console.WriteLine($"\n>>>{tag}<<< BaseString :: '{authToken.BaseString}'<<<");
  38. Console.WriteLine($"\n>>>{tag}<<< Authorization Token :: '{authToken.Token}'<<<");
  39. // make api call with authToken.Token
  40. }

How to Generate L12 Authorization Header

(for cross zone api from intranet to internet)

  1. public void L12Sample()
  2. {
  3. var URL_WOG = "https://{wog_gatewayName}.api.gov.sg/api/v1/reslource";
  4. var APP_NAME_WOG = "{wog_appName}";
  5. var APP_SECRET_WOG = "{wog_AppSecret}";
  6. var URL_WWW = "https://{www_appName}.api.gov.sg/api/v1/resource";
  7. var APP_NAME_WWW = "{www_AppName}";
  8. var PRIVATE_KEY_FILE_NAME = "Certificates/www_privateKey.pkcs8");
  9. var PRIVATE_KEY_PASSPHRASE = "{passphrase}";
  10. // get the private key from pem file (in pkcs8 format)
  11. var privateKey = ApiAuthorization.GetPrivateKey(PRIVATE_KEY_FILE_NAME, PRIVATE_KEY_PASSPHRASE);
  12. // prepare queryString
  13. var queryData = new QueryData();
  14. queryData.Add("view", "net-5.0");
  15. queryData.Add("system", "C# sample code");
  16. // prepare form data
  17. var formData = new FormData();
  18. formData.Add("name", "peter pan");
  19. formData.Add("age", "12");
  20. // prepare the token parameters
  21. var authParam = new AuthParam()
  22. {
  23. url = new Uri($"{URL_WOG}{queryData.ToString()}"),
  24. httpMethod = HttpMethod.POST,
  25. appName = APP_NAME_WOG,
  26. appSecret = APP_SECRET_WOG,
  27. formData = formData,
  28. nextHop = new AuthParam()
  29. {
  30. url = new Uri($"{URL_WWW}{queryData.ToString()}"),
  31. appName = APP_NAME_WWW,
  32. privateKey = privateKey,
  33. }
  34. };
  35. // get the authorization token
  36. var authToken = ApiAuthorization.TokenV2(authParam);
  37. Console.WriteLine($"\n>>> BaseString :: '{authToken.BaseString}'<<<");
  38. Console.WriteLine($"\n>>> Authorization Token :: '{authToken.Token}'<<<");
  39. // make api call with authToken.Token
  40. }

Release

Contributing

  • For more information about contributing PRs and issues, see CONTRIBUTING.md.

License

MIT LICENSE

References