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位
每月下载80次
26KB
343 行
nickel-jwt-session
实验性的基于jwt的用户会话,用于nickel。请注意,nickel的最新版本于2019年1月发布(并且这依赖于一个更早的版本)。这或许不再使用,但对于某些人来说可能仍值得关注。
配置
默认情况下,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 License,版本 2.0 (https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (http://opensource.org/licenses/MIT)
。
贡献
除非您明确表示,否则根据 Apache-2.0 许可证定义的,您提交给作品的所有有意贡献将双重许可,如上所述,没有任何额外的条款或条件。
依赖关系
约 11MB
约 205K SLoC