I have been following Web applications (ASP.NET MVC) Attempting to connect to one of the Google APIs.
using System;
using System.Web.Mvc;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2.Mvc;
using Google.Apis.Drive.v2;
using Google.Apis.Util.Store;
namespace Google.Apis.Sample.MVC4
{
public class AppFlowMetadata : FlowMetadata
{
private static readonly IAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "PUT_CLIENT_ID_HERE",
ClientSecret = "PUT_CLIENT_SECRET_HERE"
},
Scopes = new[] { DriveService.Scope.Drive },
DataStore = new FileDataStore("Drive.Api.Auth.Store")
});
public override string GetUserId(Controller controller)
{
// In this sample we use the session to store the user identifiers.
// That's not the best practice, because you should have a logic to identify
// a user. You might want to use "OpenID Connect".
// You can read more about the protocol in the following link:
// https://developers.google.com/accounts/docs/OAuth2Login.
var user = controller.Session["user"];
if (user == null)
{
user = Guid.NewGuid();
controller.Session["user"] = user;
}
return user.ToString();
}
public override IAuthorizationCodeFlow Flow
{
get { return flow; }
}
}
}
The sample doesn't appear to work with .net core as it cant find FlowMetadata
Sign in with GoogleRun the app and select Log in. An option to sign in with Google appears. Select the Google button, which redirects to Google for authentication. After entering your Google credentials, you are redirected back to the web site.
The problem is that the above sample was not designed for .net core.
clientinfo.cs
/// <summary>
/// Client auth information, loaded from a Google user credential json file.
/// Set the TEST_CLIENT_SECRET_FILENAME environment variable to point to the credential file.
/// </summary>
public class ClientInfo
{
public static ClientInfo Load()
{
const string ClientSecretFilenameVariable = "TEST_CLIENT_SECRET_FILENAME";
string clientSecretFilename = Environment.GetEnvironmentVariable(ClientSecretFilenameVariable);
if (string.IsNullOrEmpty(clientSecretFilename))
{
throw new InvalidOperationException($"Please set the {ClientSecretFilenameVariable} environment variable before running tests.");
}
var secrets = JObject.Parse(Encoding.UTF8.GetString(File.ReadAllBytes(clientSecretFilename)))["web"];
var projectId = secrets["project_id"].Value<string>();
var clientId = secrets["client_id"].Value<string>();
var clientSecret = secrets["client_secret"].Value<string>();
return new ClientInfo(projectId, clientId, clientSecret);
}
private ClientInfo()
{
Load();
}
private ClientInfo(string projectId, string clientId, string clientSecret)
{
ProjectId = projectId;
ClientId = clientId;
ClientSecret = clientSecret;
}
public string ProjectId { get; }
public string ClientId { get; }
public string ClientSecret { get; }
}
Program.cs
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args)
{
var clientInfo = ClientInfo.Load();
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureServices(services =>
{
services.AddSingleton(clientInfo);
})
.Build();
}
}
startup.cs configure services
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "Google";
})
.AddCookie("Cookies")
.AddGoogleOpenIdConnect("Google", options =>
{
var clientInfo = (ClientInfo)services.First(x => x.ServiceType == typeof(ClientInfo)).ImplementationInstance;
options.ClientId = clientInfo.ClientId;
options.ClientSecret = clientInfo.ClientSecret;
options.Scope.Add("profile");
});
}
add the following to configure as well app.UseAuthentication();
controler
[GoogleScopedAuthorize("https://www.googleapis.com/auth/analytics.readonly")]
public async Task<IActionResult> GoogleAnalyticsReport([FromServices] IGoogleAuthProvider auth, [FromServices] ClientInfo clientInfo, long ViewId)
{
var cred = await auth.GetCredentialAsync();
var service = new AnalyticsReportingService(new BaseClientService.Initializer
{
HttpClientInitializer = cred
});
LogOut
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync();
return RedirectToAction("Index");
}
Its now logging my user in and i can request data.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With