1 个不稳定版本
0.1.0 | 2024年3月31日 |
---|
2134 在 网页编程
51KB
1K SLoC
wx-login-middleware
一个 Rust 库,以流行网页框架中间件的形式提供微信小程序登录和认证功能,使用方便。
示例
Axum
use axum::{routing::get, Router};
use wx_login_middleware::preclude::*;
let app = Router::new()
// `GET /auth` goes to `auth` which require login authendication
.route("/auth", get(auth))
// add the layer of wx_login_middleware for login and authentication
// by default the login API is `GET|POST /login`
// here we use default config of app-info from environment variables
// (e.g. WX_APP_"TheAppID"="TheAppSecret")
.layer(wx_login::axum::layer_with_env_var());
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap();
axum::serve(listener, app).await.unwrap();
// use WxLoginInfo extractor to check authentication result
async fn auth(login_info: wx_login::WxLoginInfo) -> String {
format!("Hello, {}!", login_info.openid)
}
Actix-Web
use actix_web::{get, App, Responder, HttpServer, HttpResponse};
use wx_login_middleware::preclude::*;
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
// add the middleware for login and authentication
// by default the login API is `GET|POST /login`
// here we use config of app-info from environment variables
// (e.g. WX_APP_"TheAppID"="TheAppSecret")
.wrap(wx_login::actix_web::middleware_with_env_var())
// `GET /auth` require login authendication
.service(auth)
}).bind(("127.0.0.1", 8080))?.run().await
}
#[get("/auth")]
// use WxLoginInfo extractor to check authentication result
async fn auth(login_info: wx_login::WxLoginInfo) -> impl Responder {
HttpResponse::Ok().body(format!("Hello, {}!", login_info.openid))
}
协议
登录
使用 GET 或 POST /login(默认路径,可以通过 wx_login::Config 进行自定义)。
请求(GET)
curl --url "https://<host>/login?appid=<your_app_id>&code=<code_from_wxlogin>"
请求(POST)
curl --request POST --url "https://<host>/login" --data '{"appid": "<your_app_id>", "code": "<code_from_wxlogin>"}'
响应
成功(StatusCode 200)
{
"openid": "<the_login_open_id>",
"stoken": "<session_token_for_subsequent_request>",
"skey": "<session_key_for_making_signature>",
}
失败(StatusCode 400|401|500)
{
"status": <status_code>,
"code": "<short_error_code>",
"message": "<error_message_for_user>",
"detail": "<debug_message_for_developer>",
}
认证
登录后,客户端可以在后续请求中附加 header WX-LOGIN-STOKEN 和 WX-LOGIN-SIG 以进行认证。
-
WX-LOGIN-STOKEN:登录响应中的会话令牌
-
WX-LOGIN-SIG:请求 URI 的签名(路径+参数),计算为 SG1:ts:nonce:sha1(uri:ts:nonce:skey)
curl --header "WX-LOGIN-STOKEN=<stoken>" --header "WX-LOGIN-SIG=<sig>" --url "https://<host>/someapi"
如果 API 服务器需要认证(通常使用 WxLoginInfo 提取器)且认证失败,将返回错误响应(StatusCode 401|500)
{
"status": <status_code>,
"code": "<short_error_code>",
"message": "<error_message_for_user>",
"detail": "<debug_message_for_developer>",
}
前端
可以在仓库的 frontend 目录中找到前端 JavaScript 示例代码以供参考。
许可证:MIT
依赖项
~17–29MB
~529K SLoC