pub struct Biscuit { /* private fields */ }Expand description
This structure represents a valid Biscuit token
It contains multiple Block elements, the associated symbol table,
and a serialized version of this data
extern crate biscuit_auth as biscuit;
use biscuit::{KeyPair, Biscuit, builder::*, builder_ext::*};
fn main() -> Result<(), biscuit::error::Token> {
let root = KeyPair::new();
// first we define the authority block for global data,
// like access rights
// data from the authority block cannot be created in any other block
let token1 = Biscuit::builder()
.fact(fact("right", &[string("/a/file1.txt"), string("read")]))?
// facts and rules can also be parsed from a string
.fact("right(\"/a/file1.txt\", \"read\")")?
.build(&root)?;
// we can create a new block builder from that token
let builder2 = BlockBuilder::new()
.check_operation("read");
let token2 = token1.append(builder2)?;
Ok(())
}Implementations§
Source§impl Biscuit
impl Biscuit
Sourcepub fn builder() -> BiscuitBuilder
pub fn builder() -> BiscuitBuilder
create the first block’s builder
call builder::BiscuitBuilder::build to create the token
Sourcepub fn from<T, KP>(slice: T, key_provider: KP) -> Result<Biscuit, Token>
pub fn from<T, KP>(slice: T, key_provider: KP) -> Result<Biscuit, Token>
deserializes a token and validates the signature using the root public key
Sourcepub fn from_base64<T, KP>(slice: T, key_provider: KP) -> Result<Biscuit, Token>
pub fn from_base64<T, KP>(slice: T, key_provider: KP) -> Result<Biscuit, Token>
deserializes a token and validates the signature using the root public key
Sourcepub fn unsafe_deprecated_deserialize<T, KP>(
slice: T,
key_provider: KP,
) -> Result<Biscuit, Token>
pub fn unsafe_deprecated_deserialize<T, KP>( slice: T, key_provider: KP, ) -> Result<Biscuit, Token>
deserializes a token and validates the signature using the root public key
This allows the deprecated 3rd party block format
Sourcepub fn to_vec(&self) -> Result<Vec<u8>, Token>
pub fn to_vec(&self) -> Result<Vec<u8>, Token>
serializes the token
Examples found in repository?
92fn generate_example_token(keypair: Arc<KeyPair>) -> Result<String, TokenError> {
93 // Create a simple test biscuit with authorization rules
94 let biscuit_builder = biscuit!(
95 r#"
96 // Grant rights to alice for resource1
97 right("alice", "resource1", "read");
98 right("alice", "resource1", "write");
99 "#
100 );
101
102 // Build and serialize the token
103 let biscuit = biscuit_builder
104 .build(&keypair)
105 .map_err(TokenError::biscuit_error)?;
106
107 let token_bytes = biscuit.to_vec().map_err(TokenError::biscuit_error)?;
108
109 // Encode to base64 for transmission
110 Ok(encode_token(&token_bytes))
111}
112
113/// Generate a token with service chain attestations
114fn generate_service_chain_token(
115 root_keypair: Arc<KeyPair>,
116 service1_public_key: String,
117 service2_public_key: String,
118) -> Result<String, TokenError> {
119 // Create a biscuit with service chain authorization
120 let biscuit_builder = biscuit!(
121 r#"
122 // Basic rights
123 right("alice", "resource1", "read");
124 right("alice", "resource1", "write");
125
126 // Service nodes
127 node($s, "node1") <- service($s) trusting authority, {node1_public_key};
128 node($s, "node2") <- service($s) trusting authority, {node2_public_key};
129 "#,
130 node1_public_key = biscuit_key_from_string(service1_public_key)?,
131 node2_public_key = biscuit_key_from_string(service2_public_key)?,
132 );
133
134 // Build and serialize the token
135 let biscuit = biscuit_builder
136 .build(&root_keypair)
137 .map_err(TokenError::biscuit_error)?;
138
139 let token_bytes = biscuit.to_vec().map_err(TokenError::biscuit_error)?;
140
141 // Encode to base64
142 Ok(encode_token(&token_bytes))
143}More examples
59fn generate_example_token() -> Result<(String, KeyPair), TokenError> {
60 // Create a test keypair
61 let keypair = KeyPair::new();
62
63 // Create a simple test biscuit with authorization rules
64 let biscuit_builder = biscuit!(
65 r#"
66 // Grant rights to alice for resource1
67 right("alice", "resource1", "read");
68 right("alice", "resource1", "write");
69 "#
70 );
71
72 // Build and serialize the token
73 let biscuit = biscuit_builder
74 .build(&keypair)
75 .map_err(TokenError::biscuit_error)?;
76
77 let token_bytes = biscuit.to_vec().map_err(TokenError::biscuit_error)?;
78
79 // Encode to base64 for transmission
80 Ok((encode_token(&token_bytes), keypair))
81}Sourcepub fn to_base64(&self) -> Result<String, Token>
pub fn to_base64(&self) -> Result<String, Token>
serializes the token and encode it to a (URL safe) base64 string
Sourcepub fn serialized_size(&self) -> Result<usize, Token>
pub fn serialized_size(&self) -> Result<usize, Token>
serializes the token
Sourcepub fn seal(&self) -> Result<Biscuit, Token>
pub fn seal(&self) -> Result<Biscuit, Token>
creates a sealed version of the token
sealed tokens cannot be attenuated
creates an authorizer from this token
Sourcepub fn append(&self, block_builder: BlockBuilder) -> Result<Biscuit, Token>
pub fn append(&self, block_builder: BlockBuilder) -> Result<Biscuit, Token>
adds a new block to the token
since the public key is integrated into the token, the keypair can be discarded right after calling this function
Sourcepub fn context(&self) -> Vec<Option<String>>
pub fn context(&self) -> Vec<Option<String>>
returns the list of context elements of each block
the context is a free form text field in which application specific data can be stored
Sourcepub fn root_key_id(&self) -> Option<u32>
pub fn root_key_id(&self) -> Option<u32>
returns an (optional) root key identifier. It provides a hint for public key selection during verification
Sourcepub fn revocation_identifiers(&self) -> Vec<Vec<u8>>
pub fn revocation_identifiers(&self) -> Vec<Vec<u8>>
returns a list of revocation identifiers for each block, in order
revocation identifiers are unique: tokens generated separately with the same contents will have different revocation ids
Sourcepub fn external_public_keys(&self) -> Vec<Option<PublicKey>>
pub fn external_public_keys(&self) -> Vec<Option<PublicKey>>
returns a list of external key for each block, in order
Blocks carrying an external public key are third-party blocks and their contents can be trusted as coming from the holder of the corresponding private key
Sourcepub fn print_block_source(&self, index: usize) -> Result<String, Token>
pub fn print_block_source(&self, index: usize) -> Result<String, Token>
prints the content of a block as Datalog source code
Sourcepub fn block_version(&self, index: usize) -> Result<u32, Token>
pub fn block_version(&self, index: usize) -> Result<u32, Token>
gets the datalog version for a given block
Sourcepub fn container(&self) -> &SerializedBiscuit
pub fn container(&self) -> &SerializedBiscuit
returns the internal representation of the token
Sourcepub fn append_with_keypair(
&self,
keypair: &KeyPair,
block_builder: BlockBuilder,
) -> Result<Biscuit, Token>
pub fn append_with_keypair( &self, keypair: &KeyPair, block_builder: BlockBuilder, ) -> Result<Biscuit, Token>
adds a new block to the token, using the provided CSPRNG
since the public key is integrated into the token, the keypair can be discarded right after calling this function
pub fn third_party_request(&self) -> Result<ThirdPartyRequest, Token>
pub fn append_third_party( &self, external_key: PublicKey, response: ThirdPartyBlock, ) -> Result<Biscuit, Token>
pub fn append_third_party_with_keypair( &self, external_key: PublicKey, response: ThirdPartyBlock, next_keypair: KeyPair, ) -> Result<Biscuit, Token>
Sourcepub fn block_symbols(&self, index: usize) -> Result<Vec<String>, Token>
pub fn block_symbols(&self, index: usize) -> Result<Vec<String>, Token>
gets the list of symbols from a block
Sourcepub fn block_public_keys(&self, index: usize) -> Result<PublicKeys, Token>
pub fn block_public_keys(&self, index: usize) -> Result<PublicKeys, Token>
gets the list of public keys from a block
Sourcepub fn block_external_key(
&self,
index: usize,
) -> Result<Option<PublicKey>, Token>
pub fn block_external_key( &self, index: usize, ) -> Result<Option<PublicKey>, Token>
gets the list of public keys from a block
Sourcepub fn block_count(&self) -> usize
pub fn block_count(&self) -> usize
returns the number of blocks (at least 1)