57 lines
2.1 KiB
C#
57 lines
2.1 KiB
C#
using Microsoft.AspNetCore.Components;
|
|
using SpotifyAPI.Web;
|
|
using SpotiParty.Web.Models;
|
|
|
|
namespace SpotiParty.Web.Services;
|
|
|
|
public sealed class AuthorizationHandler(NavigationManager navigator, DatabaseContext context) {
|
|
|
|
private async Task<(string clientId, string clientSecret)> GetClientSecrets() {
|
|
var fileLines = await File.ReadAllLinesAsync(Path.Combine(Environment.CurrentDirectory, ".dev-token"));
|
|
return (fileLines[0], fileLines[1]);
|
|
}
|
|
|
|
public async Task<SpotifyClient?> ConfigureClient(Guid userId) {
|
|
var user = await context.Users.FindAsync(userId);
|
|
if (user is null) return null;
|
|
|
|
var (clientId, clientSecret) = await GetClientSecrets();
|
|
var request = new AuthorizationCodeRefreshRequest(clientId, clientSecret, user.RefreshToken);
|
|
var response = await new OAuthClient().RequestToken(request);
|
|
|
|
return new SpotifyClient(response.AccessToken);
|
|
}
|
|
|
|
public async Task<Uri> ConstructLoginUri() {
|
|
var (clientId, _) = await GetClientSecrets();
|
|
var request = new LoginRequest(
|
|
new Uri(navigator.BaseUri + "callback"),
|
|
clientId,
|
|
LoginRequest.ResponseType.Code) {
|
|
Scope = [Scopes.UserReadPlaybackState, Scopes.UserModifyPlaybackState, Scopes.UserReadPrivate, Scopes.UserReadEmail]
|
|
};
|
|
|
|
return request.ToUri();
|
|
}
|
|
|
|
public async Task HandleCallback(string code) {
|
|
var (clientId, clientSecret) = await GetClientSecrets();
|
|
var response = await new OAuthClient().RequestToken(
|
|
new AuthorizationCodeTokenRequest(
|
|
clientId,
|
|
clientSecret,
|
|
code,
|
|
new Uri(navigator.BaseUri + "callback")));
|
|
|
|
var client = new SpotifyClient(response.AccessToken);
|
|
var spotiUser = await client.UserProfile.Current();
|
|
var user = new User {
|
|
DisplayName = spotiUser.DisplayName,
|
|
RefreshToken = response.RefreshToken
|
|
};
|
|
|
|
await context.Users.AddAsync(user);
|
|
await context.SaveChangesAsync();
|
|
}
|
|
|
|
} |