#登录 #中间件 #Web 框架 #微信 #表单 #actix-web #axum

wx-login-middleware

一个 Rust 库,以流行网页框架中间件的形式提供微信小程序登录和认证功能,使用方便。

1 个不稳定版本

0.1.0 2024年3月31日

2134网页编程

MIT 许可证

51KB
1K SLoC

Rust 1K SLoC // 0.0% comments JavaScript 138 SLoC // 0.0% comments

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-STOKENWX-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