Oauth2 login to Google api with ASP .net core MVC

前端 未结 1 497
予麋鹿
予麋鹿 2021-01-13 06:24

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         


        
相关标签:
1条回答
  • 2021-01-13 06:34

    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.

    0 讨论(0)
提交回复
热议问题