public AuthenticationResult Authenticate() { this.tokens = this.tokenRepository.GetTokens(); if (this.tokens == null) { throw new NoTokensException("Application not authorised. ", this.GetAuthorizationUrl()); } if (this.IsExpired(this.tokens)) { this.logger.LogDebug("oauth tokens expired, refreshing"); try { this.tokens = this.RefreshTokens(); this.tokenRepository.SaveTokens(this.tokens); } catch (Exception ex) { return(new AuthenticationResult { Exception = ex }); } } return(new AuthenticationResult { AccessToken = this.tokens.AccessToken, Success = true }); }
public void GetTokenRefreshResponse_GetsTokens() { HttpWebResponse response = Substitute.For <HttpWebResponse>(); response.GetResponseStream().Returns(new MemoryStream(GetTestRefreshBody())); OAuthAccessTokens result = AuthorizationResponseReader.ReadTokenRefreshResponse(response); Assert.NotNull(result); }
public void IsExpired_ReturnsCorrectly( int acquiredAgo, int expiresIn, int earlyExpiry, bool expectedResult) { OAuthAccessTokens tokens = new OAuthAccessTokens { Acquired = DateTime.UtcNow.Subtract(TimeSpan.FromSeconds(acquiredAgo)), ExpiresIn = expiresIn }; Assert.Equal(expectedResult, TokenValidityChecker.IsExpired(tokens, earlyExpiry)); }
public void GetTokens_FileDoesntExist_ReturnsNull() { IFileSystem fileSystem = Substitute.For <IFileSystem>(); fileSystem.OpenRead(Arg.Any <string>()).Returns((x) => { throw new FileNotFoundException(); }); this.sut = new JsonFileTokenRepository(fileSystem); OAuthAccessTokens result = this.sut.GetTokens(); Assert.Null(result); }
public void GetTokens_FileExists_GetsTokens() { IFileSystem fileSystem = Substitute.For <IFileSystem>(); fileSystem.OpenRead(Arg.Any <string>()).Returns(this.GetTestTokenStream()); this.sut = new JsonFileTokenRepository(fileSystem); OAuthAccessTokens result = this.sut.GetTokens(); Assert.NotNull(result); }
public void GetTokens_Succeeds() { File.Copy($"../../../testdata/{TokenFilename}", TokenFilename, true); this.sut = new JsonFileTokenRepository(new FileSystem()); OAuthAccessTokens result = this.sut.GetTokens(); Assert.NotNull(result); File.Delete(TokenFilename); }
public static OAuthAccessTokens ReadTokenRefreshResponse(HttpWebResponse response) { StreamReader streamReader = new StreamReader(response.GetResponseStream()); OAuthAccessTokens tokens = null; using (JsonTextReader textReader = new JsonTextReader(streamReader)) { JsonSerializer serializer = new JsonSerializer(); tokens = serializer.Deserialize <OAuthAccessTokens>(textReader); tokens.Acquired = DateTime.UtcNow; } return(tokens); }
public void SaveTokens_SavesTokens() { IFileSystem fileSystem = Substitute.For <IFileSystem>(); fileSystem.OpenWrite(Arg.Any <string>()).Returns(new MemoryStream()); OAuthAccessTokens accessTokens = new OAuthAccessTokens { AccessToken = "foo", RefreshToken = "bar", TokenType = "bundy" }; this.sut = new JsonFileTokenRepository(fileSystem); this.sut.SaveTokens(accessTokens); fileSystem.ReceivedWithAnyArgs().OpenWrite(default(string)); }
public void SaveTokens_Succeeds() { OAuthAccessTokens accessTokens = new OAuthAccessTokens { AccessToken = "foo", RefreshToken = "bar", TokenType = "bundy" }; File.Delete(TokenFilename); this.sut = new JsonFileTokenRepository(new FileSystem()); this.sut.SaveTokens(accessTokens); Assert.True(File.Exists(TokenFilename)); File.Delete(TokenFilename); }
public OAuthAccessTokens GetTokens() { OAuthAccessTokens tokens = null; try { string fullTokenFilename = Path.Combine(Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"), TokenFilename); StreamReader streamReader = new StreamReader(this.fileSystem.OpenRead(fullTokenFilename)); using (JsonTextReader textReader = new JsonTextReader(streamReader)) { JsonSerializer serializer = new JsonSerializer(); tokens = serializer.Deserialize <OAuthAccessTokens>(textReader); } } catch (FileNotFoundException) { } return(tokens); }
private Stream GetTestTokenStream() { OAuthAccessTokens tokens = new OAuthAccessTokens { AccessToken = "foo", RefreshToken = "bar", TokenType = "bundy" }; MemoryStream stream = new MemoryStream(); StreamWriter streamWriter = new StreamWriter(stream); JsonTextWriter textWriter = new JsonTextWriter(streamWriter); JsonSerializer serializer = new JsonSerializer(); serializer.Serialize(textWriter, tokens); textWriter.Flush(); stream.Position = 0; return(stream); }
public void SaveTokens(OAuthAccessTokens accessTokens) { if (accessTokens == null) { throw new ArgumentNullException(nameof(accessTokens)); } string fullTokenFilename = Path.Combine(Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"), TokenFilename); this.fileSystem.Delete(fullTokenFilename); StreamWriter streamWriter = new StreamWriter(this.fileSystem.OpenWrite(fullTokenFilename)); using (JsonTextWriter textWriter = new JsonTextWriter(streamWriter)) { JsonSerializer serializer = new JsonSerializer(); serializer.Serialize(textWriter, accessTokens); textWriter.Flush(); } }
public void GetOAuthAccessTokens_GetsTokens_ReturnsTokens() { IHttpClient httpClient = Substitute.For <IHttpClient>(); HttpWebResponse response = Substitute.For <HttpWebResponse>(); response.StatusCode.Returns(HttpStatusCode.OK); response.GetResponseStream().Returns(this.GetTokensBody()); httpClient.Execute(Arg.Any <HttpWebRequest>()).Returns(response); VstsConfig vstsConfig = new VstsConfig { TokenUrl = @"https://app.vssps.visualstudio.com/oauth2/token", AuthorizationUrl = @"http://localhost:5000/api/auth", TokenBodyTemplate = "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}" }; this.sut = new VstsOAuthAuthorizationService(httpClient, vstsConfig); OAuthAccessTokens result = this.sut.GetOAuthAccessTokens("someCode", "someState|someSecret"); Assert.NotNull(result); }
public static bool IsExpired(OAuthAccessTokens tokens, int earlyExpiry) { if (tokens == null) { throw new ArgumentNullException(nameof(tokens)); } if (earlyExpiry < 0) { throw new ArgumentException("argument cannot be less than zero", nameof(earlyExpiry)); } int effectiveExpiry; if (earlyExpiry > tokens.ExpiresIn) { effectiveExpiry = tokens.ExpiresIn; } else { effectiveExpiry = tokens.ExpiresIn - earlyExpiry; } return(tokens.Acquired.AddSeconds(effectiveExpiry) < DateTime.UtcNow); }
protected override bool IsExpired(OAuthAccessTokens tokens) { return(false); }
protected virtual bool IsExpired(OAuthAccessTokens tokens) { return(TokenValidityChecker.IsExpired(tokens, this.vstsConfig.TokenEarlyExpiry)); }