예제 #1
0
        public async Task <TautulliToken> GetTautulliToken(PlexToken plexToken)
        {
            var request = new HttpRequestMessage(HttpMethod.Post, _configurationService.GetTautulliUrl() + "/auth/signin");

            request.Content = new StringContent($"username=&password=&token={plexToken.Value}&remember_me=1", Encoding.UTF8, "application/x-www-form-urlencoded");
            request.Headers.Add("Accept", "application/json");
            request.Headers.Add("User-Agent", "PlexSSO/2");

            var response = await _httpClient.SendAsync(request);

            response.EnsureSuccessStatusCode();

            var json = await response.Content.ReadAsStringAsync();

            var tautulliResponse = JsonSerializer.Deserialize <TautulliTokenResponse>(json, new JsonSerializerOptions
            {
                AllowTrailingCommas         = true,
                PropertyNamingPolicy        = JsonNamingPolicy.CamelCase,
                PropertyNameCaseInsensitive = true
            });

            return(string.IsNullOrWhiteSpace(tautulliResponse.Token) || tautulliResponse.Status != "success"
                ? null
                : new TautulliToken(tautulliResponse.UUID, tautulliResponse.Token));
        }
예제 #2
0
        public async Task <SsoResponse> Login([FromBody] LoginPost data)
        {
            try
            {
                var token = new PlexToken(data.Token);
                var(accessTier, loggedIn) = GetAccessTier();
                if (!loggedIn)
                {
                    accessTier = await _plexClient.GetAccessTier(serverIdentifier, token);
                }

                if (accessTier == AccessTier.Failure)
                {
                    var loginFailureResponse = _authValidator.ValidateAuthenticationStatus(AccessTier.NoAccess, false, GetServiceName(), GetServiceUri(), string.Empty);
                    Response.StatusCode = loginFailureResponse.Status;
                    return(loginFailureResponse);
                }

                var user = await _plexClient.GetUserInfo(token);

                var claims = new List <Claim>
                {
                    new Claim(Constants.AccessTierClaim, accessTier.ToString()),
                    new Claim(Constants.AccessTokenClaim, token.Value),
                    new Claim(Constants.ServerIdentifierClaim, serverIdentifier.Value),
                    new Claim(Constants.UsernameClaim, user.Username),
                    new Claim(Constants.EmailClaim, user.Email),
                    new Claim(Constants.ThumbnailClaim, user.Thumbnail)
                };

                var identity = new ClaimsIdentity(
                    claims,
                    CookieAuthenticationDefaults.AuthenticationScheme
                    );

                var authProperties = new AuthenticationProperties
                {
                    AllowRefresh = true,
                    IsPersistent = true
                };

                await HttpContext.SignInAsync(
                    CookieAuthenticationDefaults.AuthenticationScheme,
                    new ClaimsPrincipal(identity),
                    authProperties
                    );

                var response = _authValidator.ValidateAuthenticationStatus(accessTier, true, GetServiceName(), GetServiceUri(), user.Username);
                Response.StatusCode = response.Status;
                return(response);
            }
            catch (Exception e)
            {
                _logger.LogError("Failed to log user in", e);
                var unhandledErrorResponse = _authValidator.ValidateAuthenticationStatus(AccessTier.NoAccess, false, GetServiceName(), GetServiceUri(), string.Empty, true);
                Response.StatusCode = unhandledErrorResponse.Status;
                return(unhandledErrorResponse);
            }
        }
예제 #3
0
        public async Task <OmbiToken> GetOmbiToken(PlexToken plexToken)
        {
            var request = new HttpRequestMessage(HttpMethod.Post, _configurationService.GetOmbiUrl() + "/api/v1/token/plextoken");

            request.Content = new StringContent($"{{\"plexToken\":\"{plexToken.Value}\"}}", Encoding.UTF8, "application/json");
            request.Headers.Add("Accept", "application/json");

            var response = await _httpClient.SendAsync(request);

            response.EnsureSuccessStatusCode();

            var json = await response.Content.ReadAsStringAsync();

            var ombiResponse = JsonSerializer.Deserialize <OmbiTokenResponse>(json, new JsonSerializerOptions
            {
                AllowTrailingCommas         = true,
                PropertyNamingPolicy        = new SnakeCaseNamingPolicy(),
                PropertyNameCaseInsensitive = true
            });

            return(string.IsNullOrWhiteSpace(ombiResponse.AccessToken)
                ? null
                : new OmbiToken(ombiResponse.AccessToken));
        }