Phoenix应用集成Firebase认证:JWT签名密钥获取及假设验证
关于Phoenix+Firebase+Joken的密钥问题解答
你的假设完全正确!Joken的with_signer函数需要的密钥,正是Firebase用于签署JWT的公钥(划重点:是公钥而非私钥,因为我们只需要验证JWT的合法性,不需要自行签发JWT)。
为什么用公钥?
Firebase签发用户ID令牌(JWT)时使用的是自己的私钥,而我们的Phoenix应用只需要对应的公钥,就能验证令牌的签名是否有效、内容是否被篡改,全程不需要接触私钥,这也是JWT验证的标准安全模式。
如何获取Firebase的JWT验证公钥?
有两种常见方式,推荐第二种更省心:
方式1:手动获取并使用
- 打开Firebase控制台,进入你的目标项目
- 点击左侧导航栏的「项目设置」(齿轮图标)
- 切换到「服务帐户」标签页
- 向下滚动找到「ID令牌验证」区域,你会看到一个元数据URL,格式类似:
https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com - 直接请求这个URL,会返回一个JSON对象,键是密钥ID(
kid),值是对应的PEM格式公钥 - 你可以把这个公钥存入你的应用配置(比如
config.exs),然后用它创建Joken签名器:signer = Joken.Signer.create("RS256", %{"pem" => "你的PEM公钥内容"})
方式2:自动获取JWKS(推荐)
Firebase提供了JWKS(JSON Web Key Set)接口,Joken可以自动从这个接口拉取、缓存并更新密钥,完全不用手动管理:
- 直接用JWKS URL创建签名器即可:
signer = Joken.Signer.create("RS256", %{"jwks_url" => "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"}) - Joken会自动处理密钥轮换的问题,当Firebase更新密钥时,你的应用会自动获取新的公钥,不用手动干预
注意事项
- 绝对不要将Firebase的私钥(比如服务帐户的JSON密钥)用于JWT验证,公钥就足够了,私钥应该严格保密在Firebase端
- 如果使用手动方式,记得定期检查密钥是否更新,避免因为Firebase轮换密钥导致验证失败
- 确保你的Phoenix应用服务器能访问Google的这个API地址,不要被防火墙或代理拦截
内容的提问来源于stack exchange,提问作者Kanes115
相关产品推荐
相关产品推荐

