-
Notifications
You must be signed in to change notification settings - Fork 454
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement the Golang version of the existing CPP Wasm plugin: OAuth #633
Comments
你好,我想尝试做这个issue。
一阶段:申请token,请求可以是GET,把id直接放在header,或者POST,id等信息放在body,这个阶段不涉及路由问题,我一定是到一个特定的路径比如/token,才能得到token
参考: 数据结构:consumer,token响应模板,auth的参数配置&规则(包括consumer的id到token的映射) 接口:
|
@Uncle-Justice 手动点赞👍 |
参照cpp版本时,我发现它的Oauth的写法和我以为的oauth有一些不一样,我想向你确认一下 cpp版本生成一个jwt,使用的签名是client_secret,导致在jwt的验证环节时,它先直接将这个jwt解码,提取出client_id,然后再去全局config里找对应的client_secret,再用这个client_secret去验证jwt,cpp版本做jwt验证的部分代码 bool PluginRootContext::checkPlugin(){
// .......
// 直接把jwt未经验证解码成字符串
auto token = jwt::decode(token_str);
CLAIM_CHECK(token, client_id, jwt::json::type::string);
CLAIM_CHECK(token, iss, jwt::json::type::string);
CLAIM_CHECK(token, sub, jwt::json::type::string);
CLAIM_CHECK(token, aud, jwt::json::type::string);
CLAIM_CHECK(token, exp, jwt::json::type::integer);
CLAIM_CHECK(token, iat, jwt::json::type::integer);
auto client_id = token.get_payload_claim("client_id").as_string();
auto it = rule.consumers.find(client_id);
if (it == rule.consumers.end()) {
LOG_DEBUG(absl::StrFormat("client_id not found:%s", client_id));
goto failed;
}
// 拿着直接解码的结果去config查到了consumer的结果之后,又回过头去做jwt的验证
auto consumer = it->second;
auto verifier =
jwt::verify()
.allow_algorithm(jwt::algorithm::hs256{consumer.client_secret})
.with_issuer(rule.issuer)
.with_subject(consumer.name)
.with_type(TypeHeader)
.leeway(rule.clock_skew);
std::error_code ec;
verifier.verify(token, ec); 并且从实现的角度而言,我使用的是 我个人认为正确的写法是,视client_secret为私钥,与client_id一起存进jwt中,使用一个服务器保留的固定公钥进行签发,验证时,使用固定公钥验证,再将jwt解码,对内部的client_id与client_secret做后续验证。 |
公私钥对格式是有要求的,不像现在secret是可以任意字符串。 |
好的,我明白了 |
关于token的测试我有一些疑问。按照cpp版本的逻辑,生成token的时候直接发送一个httpresponse,状态码200,内部含token内容,然后ActionContinue,然后 我在写测试代码的时候,比如我只简单的测试一个响应码为200的生成token的用例,但是在 我的疑问有
|
这种想法是错误的,当时我没有足够理解jwt。原因:jwt中只有signature是加密的,header和payload都只做了base64编码,因此将client_secret作为私钥存进payload,等验证后再与服务器内的consumer比较的这种做法根本不成立,client_secret必须加密传输。 所以cpp版本的写法才更符合jwt的设计逻辑,先解码payload,再做signature验证。 |
No description provided.
The text was updated successfully, but these errors were encountered: