SMS メッセージの送受信に Plivo を使用するアプリケーションの開発に取り組んでいます。Plivo が送信するすべてのリクエストに対して、HTTP ヘッダーで署名も送信するため、リクエストがランダムなユーザーからではなく、Plivo からのものであることを確認できます。
https://www.plivo.com/docs/xml/request/#validation
この検証を行うには、クエリ文字列 (例: To=15555555555&From=11234567890&TotalRate=0&Units=1&Text=Text!&TotalAmount=0&Type=sms&MessageUUID=2be622bc-79f8-11e6-8dc0-06435fceaad7
) として POST コンテンツが必要です。
現在のソリューション
これは私たちがこれまでに持っているものです:
private bool VerifyPlivo(object thing, HttpRequestMessage Request)
{
if (Request.Headers.Contains("X-Plivo-Signature"))
{
Dictionary<string, string> reqParams = (from x in thing.GetType().GetProperties() select x).ToDictionary(x => x.Name, x => (x.GetGetMethod().Invoke(thing, null) == null ? "" : x.GetGetMethod().Invoke(thing, null).ToString()));
IEnumerable<string> headerValues = Request.Headers.GetValues("X-Plivo-Signature");
string signature = headerValues.FirstOrDefault();
return XPlivoSignature.Verify(Request.RequestUri.ToString(), reqParams, signature, plivoToken);
}
else
{
return false;
}
}
[Route("RecieveSMS")]
[HttpPost]
public HttpResponseMessage RecieveSMS(PlivoRecieveSMS req)
{
if (!VerifyPlivo(req, Request))
{
return new HttpResponseMessage(HttpStatusCode.Forbidden);
}
... // do actual work here
}
これは、マップ先のオブジェクトを使用し、PlivoRecieveSMS
リフレクションを行ってプロパティと値を取得し、それらをディクショナリに貼り付けることで機能します。これは、特に好ましい解決策がないことを考えるとうまく機能します...
優先ソリューション
現在、PlivoRecieveSMS
データをマッピングするモデル ( ) が必要であり、イントロスペクションを行ってキー/値を見つけます。ロジックを の拡張に移動して、次のSystem.Web.Http.AuthorizeAttribute
ような単純なことを実行できるようにします。
[AuthorizedPlivoApi]
[Route("RecieveSMS")]
[HttpPost]
public HttpResponseMessage RecieveSMS(PlivoRecieveSMS req)
{
... // do actual work here
}
実際の認可は で行われAuthorizedPlivoApi
ます - 有効でない場合、リクエストはコントローラーに到達しません。しかし、現時点ではこれを行うことはできません。これは、 内の特定のオブジェクトにマップできないためですAuthorizedPlivoApi
。
POST キーの / 値に直接アクセスするか、事前に定義されていない動的オブジェクトにマップしたいと思います。それができれば、望ましい解決策を実現できます。
tl;dr:特定のモデルを使用せずapplication/x-www-form-urlencoded
に POST リクエストから にデータをプッシュする方法はありますか?Dictionary<string,string>()