我是 Golang 的新初学者,我开始使用 JWT 学习 Gorilla/Mux。
我刚刚成功注册用户到 MongoDB,然后登录。我用Postman来测试。但是当我尝试浏览受保护的路线时。我在验证中收到错误“缺少身份验证令牌”。
邮递员如何获得浏览受保护路由的授权?
下面是注册和登录的代码:
路由器功能
func Router() *mux.Router {
router := mux.NewRouter().StrictSlash(true)
router.Use(CommonMiddleware)
//router.HandleFunc("/", middleware.TestAPI).Methods("GET", "OPTIONS")
router.HandleFunc("/register", middleware.RegisterHandler).Methods("POST", "OPTIONS")
router.HandleFunc("/login", middleware.LoginHandler).Methods("POST", "OPTIONS")
secure := router.PathPrefix("/auth").Subrouter()
secure.Use(auth.JwtVerify)
secure.HandleFunc("/api/task", middleware.GetAllTask).Methods("GET", "OPTIONS")
secure.HandleFunc("/api/task", middleware.CreateTask).Methods("POST", "OPTIONS")
secure.HandleFunc("/api/task/{id}", middleware.TaskComplete).Methods("PUT", "OPTIONS")
secure.HandleFunc("/api/undoTask/{id}", middleware.UndoTask).Methods("PUT", "OPTIONS")
secure.HandleFunc("/api/deleteTask/{id}", middleware.DeleteTask).Methods("DELETE", "OPTIONS")
secure.HandleFunc("/api/deleteAllTask", middleware.DeleteAllTask).Methods("DELETE", "OPTIONS")
return router
}
func CommonMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/json")
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, …Run Code Online (Sandbox Code Playgroud) 为了部署 NodeJS,我使用 systemd 并配置 /lib/systemd/system/[service_name].service 文件
=========================================
[Unit]
Description=Inventory Management System
Documentation=PLM Inventory Management Documents
After=network.target
[Service]
Environment=NODE_PORT=3000
Type=simple
User=superuser
WorkingDirectory=/home/superuser/inventory
ExecStart=/home/superuser/.npm-global/bin/nodemon --exec babel-node /home/superuser/inventory/server/server.js
Restart=on-failure
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
=========================================
如何通过 systemd 在 ubuntu 服务器上部署 NextJS?
提前致谢。
我有一个新的 Rust 编程后端学习。\n从 Web 框架开始。\n因为我想将 Rust 后端与 MongoDB 一起使用,所以我有 Nickel 的示例代码。\n无论如何,我还看到有 Actix Web 框架。
\n\nActix Web 是否像 Nickel 一样支持 MongoDB?
\n\n以下示例通过 MongoDB 提供 Nickel。
\n\n//main.rs \xe2\x80\x94 Nickel\n#[macro_use]\xc2\xa0\nextern\xc2\xa0crate\xc2\xa0nickel;\nextern\xc2\xa0crate\xc2\xa0rustc_serialize;\n\n#[macro_use(bson,\xc2\xa0doc)]\nextern\xc2\xa0crate\xc2\xa0bson;\nextern\xc2\xa0crate\xc2\xa0mongodb;\n\n//\xc2\xa0Nickel\nuse\xc2\xa0nickel::{Nickel,\xc2\xa0JsonBody,\xc2\xa0HttpRouter,\xc2\xa0MediaType};\nuse\xc2\xa0nickel::status::StatusCode::{self};\n\n//\xc2\xa0MongoDB\nuse\xc2\xa0mongodb::{Bson,\xc2\xa0bson,\xc2\xa0doc};\nuse\xc2\xa0mongodb::{Client,\xc2\xa0ThreadedClient};\nuse\xc2\xa0mongodb::db::ThreadedDatabase;\nuse\xc2\xa0mongodb::error::Result\xc2\xa0as\xc2\xa0MongoResult;\n\n//\xc2\xa0bson\nuse\xc2\xa0bson::{Bson,\xc2\xa0Document};\nuse\xc2\xa0bson::oid::ObjectId;\n\n//\xc2\xa0serde\nuse\xc2\xa0serde::{Serialize,\xc2\xa0Deserialize};\n\nuse\xc2\xa0std::fs::File;\nuse\xc2\xa0std::io::Read;\n#[derive(Debug,\xc2\xa0Serialize,\xc2\xa0Deserialize)]\nstruct\xc2\xa0User\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0firstname:\xc2\xa0String,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0lastname:\xc2\xa0String,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0email:\xc2\xa0String\n}\n\nfn\xc2\xa0main(){\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0mut\xc2\xa0server\xc2\xa0=\xc2\xa0Nickel::new();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0mut\xc2\xa0router\xc2\xa0=\xc2\xa0Nickel::router();\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0router.get("/users",\xc2\xa0middleware!\xc2\xa0{\xc2\xa0|_req,\xc2\xa0_res|\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0client\xc2\xa0=\xc2\xa0Client::connect("localhost",\xc2\xa027017)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.ok().expect("Error\xc2\xa0establishing\xc2\xa0connection.");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0coll\xc2\xa0=\xc2\xa0client.db("rusty").collection("users");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0mut\xc2\xa0cursor\xc2\xa0=\xc2\xa0coll.find(None,\xc2\xa0None).unwrap();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0mut\xc2\xa0data_result\xc2\xa0=\xc2\xa0"{\\"data\\":[".to_owned();\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0for\xc2\xa0(i,\xc2\xa0result)\xc2\xa0in\xc2\xa0cursor.enumerate()\xc2\xa0{\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if\xc2\xa0let\xc2\xa0Ok(item)\xc2\xa0=\xc2\xa0result\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if\xc2\xa0let\xc2\xa0Some(&Bson::String(ref\xc2\xa0firstname))\xc2\xa0=\xc2\xa0item.get("firstname")\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0string_data\xc2\xa0=\xc2\xa0if\xc2\xa0i\xc2\xa0==\xc2\xa00\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0format!("{},",\xc2\xa0firstname)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\xc2\xa0else\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0format!("{},",\xc2\xa0firstname)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0};\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0data_result.push_str(&string_data);\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0data_result.push_str("]}");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0format!("{}",\xc2\xa0data_result)\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0});\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0router.post("/users/new",\xc2\xa0middleware!\xc2\xa0{\xc2\xa0|_req,\xc2\xa0_res|\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0user\xc2\xa0=\xc2\xa0_req.json_as::<User>().unwrap();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0firstname\xc2\xa0=\xc2\xa0user.firstname.to_string();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0lastname\xc2\xa0=\xc2\xa0user.lastname.to_string();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0email\xc2\xa0=\xc2\xa0user.email.to_string();\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0client\xc2\xa0=\xc2\xa0Client::connect("localhost",\xc2\xa027017)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.ok().expect("Error\xc2\xa0establishing\xc2\xa0connection.");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0coll\xc2\xa0=\xc2\xa0client.db("rusty").collection("users");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0match\xc2\xa0coll.insert_one(doc!\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0"firstname"\xc2\xa0=>\xc2\xa0firstname,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0"lastname"\xc2\xa0=>\xc2\xa0lastname,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0"email"\xc2\xa0=>\xc2\xa0email\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0},\xc2\xa0None)\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Ok(_)\xc2\xa0=>\xc2\xa0(StatusCode::Ok,\xc2\xa0"Item\xc2\xa0saved!"),\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Err(e)\xc2\xa0=>\xc2\xa0return\xc2\xa0_res.send(format!("{}",\xc2\xa0e))\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0});\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0router.delete("/users/:id",\xc2\xa0middleware!\xc2\xa0{\xc2\xa0|_req,\xc2\xa0_res|\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0client\xc2\xa0=\xc2\xa0Client::connect("localhost",\xc2\xa027017)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.ok().expect("Failed\xc2\xa0to\xc2\xa0initialize\xc2\xa0standalone\xc2\xa0client.");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0coll\xc2\xa0=\xc2\xa0client.db("rusty").collection("users");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0object_id\xc2\xa0=\xc2\xa0_req.param("id").unwrap();\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let\xc2\xa0id\xc2\xa0=\xc2\xa0match\xc2\xa0ObjectId::with_string(object_id)\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Ok(oid)\xc2\xa0=>\xc2\xa0oid,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Err(e)\xc2\xa0=>\xc2\xa0return\xc2\xa0_res.send(format!("{}",\xc2\xa0e))\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0};\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0match\xc2\xa0coll.delete_one(doc!\xc2\xa0{"_id"\xc2\xa0=>\xc2\xa0id},\xc2\xa0None)\xc2\xa0{\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Ok(_)\xc2\xa0=>\xc2\xa0(StatusCode::Ok,\xc2\xa0"Item\xc2\xa0deleted!"),\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Err(e)\xc2\xa0=>\xc2\xa0return\xc2\xa0_res.send(format!("{}",\xc2\xa0e))\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0});\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0server.utilize(router);\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0server.listen("0.0.0.0:3000").unwrap();\n}\nRun Code Online (Sandbox Code Playgroud)\n