| // Copyright 2022 The casbin Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| use crate::model::user::LoginInfo; |
| |
| use chrono::Utc; |
| use jsonwebtoken::{EncodingKey, Header}; |
| use serde::{Deserialize, Serialize}; |
| |
| static THREE_HOUR: i64 = 60 * 60 * 3; |
| pub static KEY: [u8; 16] = *include_bytes!("../secret.key"); |
| |
| #[derive(Serialize, Deserialize)] |
| pub struct UserToken { |
| // issued at |
| pub iat: i64, |
| // expiration |
| pub exp: i64, |
| // userID |
| pub user_name: String, |
| pub role: String, |
| pub login_session: String, |
| } |
| |
| impl UserToken { |
| pub fn generate_token(login: LoginInfo) -> String { |
| let now = Utc::now().timestamp_nanos() / 1_000_000_000; |
| let payload = UserToken { |
| iat: now, |
| exp: now + THREE_HOUR, |
| user_name: login.username, |
| role: login.role, |
| login_session: login.login_session, |
| }; |
| |
| jsonwebtoken::encode( |
| &Header::default(), |
| &payload, |
| &EncodingKey::from_secret(&KEY), |
| ) |
| .unwrap() |
| } |
| } |