Skip to content

Commit 9d17ca2

Browse files
authored
Merge pull request #103 from mjcheetham/gh-oauthenv
Allow GitHub OAuth params to be overridden at runtime
2 parents 7efe852 + e2d7b80 commit 9d17ca2

File tree

3 files changed

+65
-10
lines changed

3 files changed

+65
-10
lines changed

src/shared/GitHub/GitHubAuthentication.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ public async Task<OAuth2TokenResult> GetOAuthTokenAsync(Uri targetUri, IEnumerab
188188
{
189189
ThrowIfUserInteractionDisabled();
190190

191-
var oauthClient = new GitHubOAuth2Client(HttpClient, targetUri);
191+
var oauthClient = new GitHubOAuth2Client(HttpClient, Context.Settings, targetUri);
192192

193193
// If we have a desktop session try authentication using the user's default web browser
194194
if (Context.IsDesktopSession)

src/shared/GitHub/GitHubConstants.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ public static class GitHubConstants
1111

1212
public const string AuthHelperName = "GitHub.UI";
1313

14+
public const string OAuthClientId = "0120e057bd645470c1ed";
15+
public const string OAuthClientSecret = "18867509d956965542b521a529a79bb883344c90";
16+
public static readonly Uri OAuthRedirectUri = new Uri("http://localhost/");
17+
public static readonly Uri OAuthAuthorizationEndpointRelativeUri = new Uri("/login/oauth/authorize", UriKind.Relative);
18+
public static readonly Uri OAuthTokenEndpointRelativeUri = new Uri("/login/oauth/access_token", UriKind.Relative);
19+
public static readonly Uri OAuthDeviceEndpointRelativeUri = new Uri("/login/oauth/authorize/device", UriKind.Relative);
20+
1421
/// <summary>
1522
/// The GitHub required HTTP accepts header value
1623
/// </summary>
@@ -51,13 +58,19 @@ public static class OAuthScopes
5158
public static class EnvironmentVariables
5259
{
5360
public const string AuthenticationModes = "GCM_GITHUB_AUTHMODES";
61+
public const string DevOAuthClientId = "GCM_DEV_GITHUB_CLIENTID";
62+
public const string DevOAuthClientSecret = "GCM_DEV_GITHUB_CLIENTSECRET";
63+
public const string DevOAuthRedirectUri = "GCM_DEV_GITHUB_REDIRECTURI";
5464
}
5565

5666
public static class GitConfiguration
5767
{
5868
public static class Credential
5969
{
6070
public const string AuthModes = "gitHubAuthModes";
71+
public const string DevOAuthClientId = "gitHubDevClientId";
72+
public const string DevOAuthClientSecret = "gitHubDevClientSecret";
73+
public const string DevOAuthRedirectUri = "gitHubDevRedirectUri";
6174
}
6275
}
6376
}
Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,75 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
13
using System;
24
using System.Net.Http;
5+
using Microsoft.Git.CredentialManager;
36
using Microsoft.Git.CredentialManager.Authentication.OAuth;
47

58
namespace GitHub
69
{
710
public class GitHubOAuth2Client : OAuth2Client
811
{
9-
private static readonly string ClientId = "0120e057bd645470c1ed";
10-
private static readonly string ClientSecret = "18867509d956965542b521a529a79bb883344c90";
11-
private static readonly Uri RedirectUri = new Uri("http://localhost/");
12-
13-
public GitHubOAuth2Client(HttpClient httpClient, Uri baseUri)
14-
: base(httpClient, CreateEndpoints(baseUri), ClientId, RedirectUri, ClientSecret) { }
12+
public GitHubOAuth2Client(HttpClient httpClient, ISettings settings, Uri baseUri)
13+
: base(httpClient, CreateEndpoints(baseUri),
14+
GetClientId(settings), GetRedirectUri(settings), GetClientSecret(settings)) { }
1515

1616
private static OAuth2ServerEndpoints CreateEndpoints(Uri baseUri)
1717
{
18-
Uri authEndpoint = new Uri(baseUri, "/login/oauth/authorize");
19-
Uri tokenEndpoint = new Uri(baseUri, "/login/oauth/access_token");
18+
Uri authEndpoint = new Uri(baseUri, GitHubConstants.OAuthAuthorizationEndpointRelativeUri);
19+
Uri tokenEndpoint = new Uri(baseUri, GitHubConstants.OAuthTokenEndpointRelativeUri);
2020

2121
Uri deviceAuthEndpoint = null;
2222
if (GitHubConstants.IsOAuthDeviceAuthSupported)
2323
{
24-
deviceAuthEndpoint = new Uri(baseUri, "/login/oauth/authorize/device");
24+
deviceAuthEndpoint = new Uri(baseUri, GitHubConstants.OAuthDeviceEndpointRelativeUri);
2525
}
2626

2727
return new OAuth2ServerEndpoints(authEndpoint, tokenEndpoint)
2828
{
2929
DeviceAuthorizationEndpoint = deviceAuthEndpoint
3030
};
3131
}
32+
33+
private static string GetClientId(ISettings settings)
34+
{
35+
// Check for developer override value
36+
if (settings.TryGetSetting(
37+
GitHubConstants.EnvironmentVariables.DevOAuthClientId,
38+
Constants.GitConfiguration.Credential.SectionName, GitHubConstants.GitConfiguration.Credential.DevOAuthClientId,
39+
out string clientId))
40+
{
41+
return clientId;
42+
}
43+
44+
return GitHubConstants.OAuthClientId;
45+
}
46+
47+
private static Uri GetRedirectUri(ISettings settings)
48+
{
49+
// Check for developer override value
50+
if (settings.TryGetSetting(
51+
GitHubConstants.EnvironmentVariables.DevOAuthRedirectUri,
52+
Constants.GitConfiguration.Credential.SectionName, GitHubConstants.GitConfiguration.Credential.DevOAuthRedirectUri,
53+
out string redirectUriStr) && Uri.TryCreate(redirectUriStr, UriKind.Absolute, out Uri redirectUri))
54+
{
55+
return redirectUri;
56+
}
57+
58+
return GitHubConstants.OAuthRedirectUri;
59+
}
60+
61+
private static string GetClientSecret(ISettings settings)
62+
{
63+
// Check for developer override value
64+
if (settings.TryGetSetting(
65+
GitHubConstants.EnvironmentVariables.DevOAuthClientSecret,
66+
Constants.GitConfiguration.Credential.SectionName, GitHubConstants.GitConfiguration.Credential.DevOAuthClientSecret,
67+
out string clientSecret))
68+
{
69+
return clientSecret;
70+
}
71+
72+
return GitHubConstants.OAuthClientSecret;
73+
}
3274
}
3375
}

0 commit comments

Comments
 (0)