Class ::nsmcp::BearerAuthenticator (public)
::nx::Class ::nsmcp::BearerAuthenticator
Defined in /usr/local/ns/tcl/nsmcp/lib/security.tcl
Only the table name enters the blueprint. Credential records live in nsv.
- Testcases:
- No testcase defined.
Source code: :property store:required :public method issue {principal permissions targets expires} { # Explicit administrative operation; never called automatically at init. # Return the secret once, without logging it or storing it in nsv. set token [ns_crypto::randombytes -encoding hex 32] set digest [:grant $token $principal $permissions $targets $expires] return [dict create token $token digest $digest expires $expires] } :public method grant {token principal permissions targets expires} { if {[string length $token] < 32 || $principal eq "" || ![string is wideinteger -strict $expires] || ($expires != 0 && $expires <= [clock seconds])} { error "expected a high-entropy token, named principal and expiry of zero or a future timestamp" } set digest [ns_crypto::md string -digest sha256 -- $token] nsv_set ${:store} $digest [dict create principal $principal permissions $permissions targets $targets expires $expires] return $digest } :public method revoke {digest} {nsv_unset -nocomplain ${:store} $digest} :public method credentialInfo {digest} { if {![nsv_get ${:store} $digest record]} {return {}} return $record } :public method authenticate {authorization server} { if {![regexp {^Bearer ([A-Za-z0-9._~+/-]+=*)$} $authorization -> token]} { return [next] } set digest [ns_crypto::md string -digest sha256 -- $token] if {![nsv_get ${:store} $digest record] || ([dict get $record expires] != 0 && [dict get $record expires] <= [clock seconds])} {return [next]} return [::nsmcp::RequestContext new -principal [dict get $record principal] -permissions [dict get $record permissions] -targets [dict get $record targets] -server $server] }XQL Not present: Generic, PostgreSQL, Oracle
![[i]](/resources/acs-subsite/ZoomIn16.gif)