using System.IdentityModel.Tokens.Jwt; using VoidCat.Database; using VoidCat.Model; namespace VoidCat.Services.Users.Auth; public class GoogleOAuthProvider : GenericOAuth2Service { private readonly HttpClient _client; public GoogleOAuthProvider(HttpClient client, VoidSettings settings) : base(client, settings) { _client = client; Details = settings.Google!; } /// public override string Id => "google"; /// public override ValueTask GetUserDetails(UserAuthToken token) { var jwt = new JwtSecurityToken(token.IdToken); string? GetPayloadValue(string key) => jwt.Payload.TryGetValue(key, out var v) ? v as string : default; return ValueTask.FromResult(new User() { Id = Guid.NewGuid(), Created = DateTime.UtcNow, LastLogin = DateTime.UtcNow, AuthType = UserAuthType.OAuth2, Email = GetPayloadValue("email") ?? throw new InvalidOperationException("Failed to get email from Google JWT"), DisplayName = GetPayloadValue("name") ?? "void user", Avatar = GetPayloadValue("picture") })!; } /// protected override string Prompt => "select_account"; /// protected override Uri AuthorizeEndpoint => new("https://accounts.google.com/o/oauth2/v2/auth"); /// protected override Uri TokenEndpoint => new("https://oauth2.googleapis.com/token"); /// protected override OAuthDetails Details { get; } /// protected override string[] Scopes => new[] {"https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"}; }