繁体   English   中英

使用 FireBase Auth Emulator 创建和验证 (JWT) 令牌

[英]Creating and validating (JWT)-tokens with FireBase Auth Emulator

我的目标是通过 firebase 管理员发布令牌,用于使用模拟器进行本地开发的身份验证。

使用 FireBase 管理员在模拟器中定位本地项目(演示项目)。 以下代码用于查找用户并颁发和验证令牌。 但是这个结果是令牌受众(aud)的不匹配。 如何解决?

Firebase ID 令牌的受众 (aud) 声明不正确。 预期的演示项目,但得到了https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit 确保 ID 令牌来自与用于初始化此 SDK 的凭据相同的 Firebase 项目

    Environment.SetEnvironmentVariable("FIREBASE_AUTH_EMULATOR_HOST", "localhost:9099");
    Environment.SetEnvironmentVariable("GCLOUD_PROJECT", "demo-project");
    
    var email = [EMAIL];
    
    GoogleCredential dummyCredential =
               GoogleCredential.FromAccessToken("test-token");
    
    var app = FirebaseApp.Create(new AppOptions
    {
        Credential = dummyCredential
    });
    var auth = FirebaseAuth.GetAuth(app);
    var user = await auth.GetUserByEmailAsync(email);
    var token = await auth.CreateCustomTokenAsync(user.Uid);
    var verifiedToken = await auth.VerifyIdTokenAsync(token);

似乎观众取决于 Admin SDK 是如何启动的,这就是不匹配的原因。 应如何启动 SDK 进行仿真器开发? 希望能够在与任何 firebase 托管项目没有任何联系的情况下实现这一目标。

使用令牌或电子邮件/密码编写了两个用于登录的 util 函数。

Environment.SetEnvironmentVariable("FIREBASE_AUTH_EMULATOR_HOST", "localhost:9099");
Environment.SetEnvironmentVariable("GCLOUD_PROJECT", "demo-project");

var email = [EMAIL];

GoogleCredential dummyCredential =
            GoogleCredential.FromAccessToken("test-token");

var app = FirebaseApp.Create(new AppOptions
{
    Credential = dummyCredential,
    ProjectId = "demo-project"
});

var auth = FirebaseAuth.DefaultInstance;
var user = await auth.GetUserByEmailAsync(email);
var token = await auth.CreateCustomTokenAsync(user.Uid);
var verifiedToken = await auth.VerifyIdTokenAsync(await SignIn.FireBaseSignIn(token));

不是使用创建自定义令牌,而是通过登录工具登录现有用户;

var user = await auth.GetUserByEmailAsync(email);
var verifiedToken = await auth.VerifyIdTokenAsync(await SignIn.FireBaseSignIn(email, [PASSWORD]));

登录工具;

public record SignInResponse(string IdToken);

public static async Task<string> FireBaseSignIn(string email, string password)
{
    var authClient = new HttpClient
    {
        BaseAddress = new Uri("http://localhost:9099/")
    };

    var res = await authClient.PostAsJsonAsync("identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=fake-api-key",
        new { email, password, returnSecureToken = true });
    res.EnsureSuccessStatusCode();

    var json = await res.Content.ReadFromJsonAsync<SignInResponse>();

    return json.IdToken;
}

public static async Task<string> FireBaseSignIn(string token)
{
    var authClient = new HttpClient
    {
        BaseAddress = new Uri("http://localhost:9099/")
    };

    var res = await authClient.PostAsJsonAsync("identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=fake-api-key",
        new { token, returnSecureToken = true });
    res.EnsureSuccessStatusCode();

    var json = await res.Content.ReadFromJsonAsync<SignInResponse>();

    return json.IdToken;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM