#nickel #jwt #authorization #jsonwebtoken #web #secret-key #signing-key

已废弃 nickel-jwt-session

基于jwt的用户会话的nickel中间件

8个版本 (重大变更)

使用旧的Rust 2015

0.10.1 2022年2月2日
0.10.0 2017年7月29日
0.6.0 2017年5月11日
0.5.0 2016年10月27日
0.1.0 2016年4月29日

#jsonwebtoken中的第9

Download history 23/week @ 2024-03-28 12/week @ 2024-04-04

每月下载80

MIT/Apache

26KB
343

nickel-jwt-session

实验性的基于jwt的用户会话,用于nickel。请注意,nickel的最新版本于2019年1月发布(并且这依赖于一个更早的版本)。这或许不再使用,但对于某些人来说可能仍值得关注。

Build Status docs

配置

默认情况下,nickel-jwt-session将在名为"jwt"的cookie中存储和查找令牌,令牌将在24小时后过期。构造函数的唯一必需参数是私有签名密钥。

extern crate nickel;
extern crate nickel_jwt_session;

use nickel::Nickel;
use nickel_jwt_session::SessionMiddleware;

fn main() {
    let mut server = Nickel::new();
    server.utilize(SessionMiddleware::new("My very secret key"));
}

您还可以自定义cookie名称。

extern crate nickel;
extern crate nickel_jwt_session;

use nickel::Nickel;
use nickel_jwt_session::{SessionMiddleware, TokenLocation};

fn main() {
    let mut server = Nickel::new();
    server.utilize(SessionMiddleware::new("My very secret key")
                   .using(TokenLocation::Cookie("my-jwt-cookie".to_owned())));
}

或使用Authorization: Bearer头信息而不是cookie。

extern crate nickel;
extern crate nickel_jwt_session;

use nickel::Nickel;
use nickel_jwt_session::{SessionMiddleware, TokenLocation};

fn main() {
    let mut server = Nickel::new();
    server.utilize(SessionMiddleware::new("My very secret key")
                   .using(TokenLocation::AuthorizationHeader));
}

并更改令牌有效的时间(秒)。

extern crate nickel;
extern crate nickel_jwt_session;

use nickel::Nickel;
use nickel_jwt_session::SessionMiddleware;

fn main() {
    let mut server = Nickel::new();
    server.utilize(SessionMiddleware::new("My very secret key")
                   .expiration_time(60 * 30)); // 30 min
}

用法

仅用户名

如果您只想存储用户名,可以使用set_jwt_user()clear_jwt()authorized_user()便利方法。

当您有一个已经验证的用户时,使用set_jwt_user()方法将新令牌放入响应。

fn login<'mw>(req: &mut Request, mut res: Response<'mw>)
              -> MiddlewareResult<'mw> {
    let authenticated_user = your_authentication_method(req);
    match authenticated_user {
        Some(username) => {
            res.set_jwt_user(username);
            res.redirect("/")
        }
        None => {
            res.redirect("/login")
        }
    }
}

要检查是否有已验证的用户,请使用authorized_user()方法。

fn private<'mw>(req: &mut Request, res: Response<'mw>)
                -> MiddlewareResult<'mw> {
    match req.authorized_user() {
        Some(user) => {
            // Whatever an authorized user is allowed to do
        },
        None => res.error(StatusCode::Forbidden, "Permission denied"),
    }
}

要注销用户,请调用clear_jwt()方法。

fn logout<'mw>(_req: &mut Request, mut res: Response<'mw>)
               -> MiddlewareResult<'mw> {
    res.clear_jwt();
    res.redirect("/")
}

仅自定义声明负载

如果您希望在声明负载中存储任意数据而不是用户名,请使用 set_jwt_custom_claims()valid_custom_claims() 方法。自定义声明必须位于一个 BTreeMap<String, Json> 中。注销仍然使用 clear_jwt() 方法。

在您成功认证后,请使用 set_jwt_custom_claims() 方法将包含您提供的数据的新令牌放入响应中

use std::collections::BTreeMap;

fn login<'mw>(req: &mut Request, mut res: Response<'mw>)
              -> MiddlewareResult<'mw> {
    let authentication_data = your_authentication_method(req);
    match authentication_data {
        Some(data) => {
            let mut d = BTreeMap::new();
            d.insert("who".to_owned(), data.who);
            d.insert("admin".to_owned(), data.admin);
            res.set_jwt_custom_claims(d);
            res.redirect("/")
        }
        None => {
            res.redirect("/login")
        }
    }
}

如果令牌有效,请使用 valid_custom_claims() 方法获取声明

fn private<'mw>(req: &mut Request, res: Response<'mw>)
                -> MiddlewareResult<'mw> {
    match req.valid_custom_claims() {
        Some(data) => {
            // Whatever you do with valid data in the claims
        },
        None => res.error(StatusCode::Forbidden, "Permission denied"),
    }
}

要结束会话,请调用 clear_jwt() 方法

fn logout<'mw>(_req: &mut Request, mut res: Response<'mw>)
               -> MiddlewareResult<'mw> {
    res.clear_jwt();
    res.redirect("/")
}

用户名和自定义声明负载

如果您想同时存储 用户名 和任意声明数据,请使用 set_jwt_user_and_custom_claims() 方法将用户名和数据添加到令牌中。然后,您可以使用 authorized_user()valid_custom_claims() 方法,分别获取用户名和声明数据。例如

use std::collections::BTreeMap;

fn login<'mw>(req: &mut Request, mut res: Response<'mw>)
              -> MiddlewareResult<'mw> {
    let authentication_data = your_authentication_method(req);
    match authentication_data {
        Some(data) => {
            let mut d = BTreeMap::new();
            d.insert("full_name".to_owned(), data.full_name);
            d.insert("admin".to_owned(), data.admin);
            res.set_jwt_user_and_custom_claims(data.username, d);
            res.redirect("/")
        }
        None => {
            res.redirect("/login")
        }
    }
}

如果令牌有效,请使用 authorized_user()valid_custom_claims() 方法获取用户名和声明

fn private<'mw>(req: &mut Request, res: Response<'mw>)
                -> MiddlewareResult<'mw> {
    match (req.authorized_user(), req.valid_custom_claims()) {
        (Some(username), Some(data)) => {
            // Whatever you do with a username and claims data
        },
        (_, _) => res.error(StatusCode::Forbidden, "Permission denied"),
    }
}

要结束会话,请调用 clear_jwt() 方法

fn logout<'mw>(_req: &mut Request, mut res: Response<'mw>)
               -> MiddlewareResult<'mw> {
    res.clear_jwt();
    res.redirect("/")
}

示例

完整的工作示例可以在 示例目录 中找到。阅读 API 文档

许可证

根据您的选择,许可方式为

贡献

除非您明确表示,否则根据 Apache-2.0 许可证定义的,您提交给作品的所有有意贡献将双重许可,如上所述,没有任何额外的条款或条件。

依赖关系

约 11MB
约 205K SLoC