Class ::nsmcp::BearerAuthenticator (public)

 ::nx::Class ::nsmcp::BearerAuthenticator[i]

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
[ hide source ] | [ make this the default ]
Show another procedure: