したい
以下のように
let middleware<'a> handler next (ctx: HttpContext) =
task {
let token = ctx.Request.Headers.["Authorization"].ToString()
match token with
| Bearer token ->
let claims = getClaims token
let! command = ctx.BindJsonAsync<'a>()
// how to add claims to command?
return! handler command next ctx
| _ ->
return! RequestErrors.unauthorized "Bearer" "Commerce" authenticationError next ctx
}
3番目のステップを実行するにはどうすればよいですか?
私がここで考えることができる4つのオプションがあります。
JWT承認プロパティをコマンドモデルに追加し、呼び出したときにそれらをバインドしないようにしてBindJsonAsync
、データを入力することができます。これは、モデルを送信する人が設定できるプロパティになってしまうため、私の最も嫌いなアプローチです。
匿名レコードを使用して、レコードタイプにプロパティを追加できます。このアプローチでは、汎用モデルバインディングを使用しているように見えるため、ここで問題を引き起こす可能性のあるコマンドのタイプを知る必要があります。また、バイナリの境界を越えて型を渡すのが難しくなります。
type CommandHandler = { Command : string; Entity : int }
let command = { Command = "Update"; Entity = 1 }
let authorisedCommand = {| command with AuthToken = "ey ===" |}
type CommandHandlerModel = { Command : string; Id : int }
type AuthorisedCommandHandlerModel = { Command : string; Id : int }
let commandHandler = { CommandHandlerModel.Command = "Update"; Id = 1 }
let authedCommandHandler = { AuthporosedCommandHandlerModel.Command = "Update"; Id = 1 }
type CommandHandlerModel = { Command : string; Id : int }
type AuthorisedCommandHandlerModel<'a> = { CommandModel : 'a; AuthToken : string }
let! command = ctx.BindJsonAsync<'a>()
let authedCommand = { CommandModel = command; AuthToken = claims }
この構成的アプローチは、問題を解決するためのより慣用的な方法であり、過去に使用したアプローチであると感じました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加