pub struct AccessToken(/* private fields */);Expand description
An access token (Authorization: Bearer <token>).
Debug prints <redacted>; there is no Display. It serializes as a plain JSON string.
No PartialEq: compare secrets in constant time (servers compare hashes). Decoding
anything but a JSON string fails with a fixed message that never quotes the value.
Implementations§
Source§impl AccessToken
impl AccessToken
Sourcepub fn new(secret: impl Into<String>) -> Self
pub fn new(secret: impl Into<String>) -> Self
Wrap a secret.
Examples found in repository?
examples/print_frames.rs (line 42)
23fn main() {
24 let now = UnixMillis(1_790_000_000_000);
25 println!("WebSocket");
26 println!("{:<22} {}", "auth (client)", WsAuth::new("example-access-token").to_message());
27 show("auth.ok", &WsServerFrame::AuthOk(Some(WsAuthOk::new(UserId(42)))));
28 show("auth.failed", &WsServerFrame::AuthFailed(ApiError::new(codes::TOKEN_EXPIRED, "the token expired")));
29 show("request chat.join", &WsRequestFrame::call(1, JoinRoom::new("world")));
30 show("answer", &WsResponseFrame::ok(1, RoomInfo::new(RoomId(12), RoomKind::Room).with_key("world")));
31 show("request chat.send", &WsRequestFrame::call(2, SendMessage::new(RoomId(12), "hello")));
32 show("answer", &WsResponseFrame::ok(2, SendAck::new(MessageId(981), now)));
33 show("refused", &WsResponseFrame::<()>::error(3, ApiError::new(codes::NOT_A_MEMBER, "join the room first")));
34 show("push chat.message", &WsPushFrame::push(ChatMessage::new(MessageId(981), RoomId(12), UserId(42), "hello", now).with_sender_name("Ada")));
35 let codes: Vec<String> = CloseCode::ALL.iter().map(|c| format!("{c}{}", if c.is_permanent() { " (permanent)" } else { "" })).collect();
36 println!("{:<22} {}", "close codes", codes.join(", "));
37
38 println!();
39 println!("HTTP");
40 show("POST login", &LoginRequest::new("ada@example.com", "example password"));
41 let tokens = TokenPair::new(
42 AccessToken::new("example-access"),
43 now.saturating_add_millis(3_600_000),
44 RefreshToken::new("example-refresh"),
45 now.saturating_add_millis(30 * 86_400_000),
46 );
47 show(" → 200", &AuthSession::new(Account::new(UserId(42), now).with_email("ada@example.com", true), tokens));
48 show("PUT storage object", &PutObject::new(serde_json::json!({"level": 3})).if_version(ObjectVersion(2)));
49 show(" → 409", &ErrorBody::new(ApiError::new(codes::VERSION_CONFLICT, "the object changed").with_details(serde_json::json!({"current_version": 3}))));
50}Sourcepub fn into_inner(self) -> String
pub fn into_inner(self) -> String
The secret, consuming the wrapper. Never log it.
Trait Implementations§
Source§impl Clone for AccessToken
impl Clone for AccessToken
Source§impl Credentials for AccessToken
Available on crate feature bevy_net_backend only.Authorization: Bearer <token> on every HTTP request and WebSocket handshake (the client’s
BearerToken does the work, including the sensitive-header flag and the refusal of a token
that is not a valid header value). The handshake header authenticates the WebSocket, so no
first-message auth is sent.
impl Credentials for AccessToken
Available on crate feature
bevy_net_backend only.Authorization: Bearer <token> on every HTTP request and WebSocket handshake (the client’s
BearerToken does the work, including the sensitive-header flag and the refusal of a token
that is not a valid header value). The handshake header authenticates the WebSocket, so no
first-message auth is sent.
Source§fn apply(&self, request: &mut OutgoingRequest)
fn apply(&self, request: &mut OutgoingRequest)
Edit the request: add a header, a query parameter or a body field. Look at
OutgoingRequest::purpose if a kind of request needs different handling.Source§fn ws_auth_message(&self) -> Option<String>
fn ws_auth_message(&self) -> Option<String>
First-message authentication for WebSocket connections (feature
ws): a text frame sent
as the very first frame on every (re)connection, for backends that read the token from the
first message instead of the handshake. Default: none. Never log what it returns.Source§impl Debug for AccessToken
impl Debug for AccessToken
Source§impl<'de> Deserialize<'de> for AccessToken
impl<'de> Deserialize<'de> for AccessToken
Source§fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>
Deserialize this value from the given Serde deserializer. Read more
Source§impl From<&str> for AccessToken
impl From<&str> for AccessToken
Source§impl From<String> for AccessToken
impl From<String> for AccessToken
Auto Trait Implementations§
impl Freeze for AccessToken
impl RefUnwindSafe for AccessToken
impl Send for AccessToken
impl Sync for AccessToken
impl Unpin for AccessToken
impl UnsafeUnpin for AccessToken
impl UnwindSafe for AccessToken
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> ConditionalSend for Twhere
T: Send,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Converts
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Converts
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Converts
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Converts
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
Source§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
Converts this type into the system output type.