Oauth 2.0 Как получить доступ к токену, сохраненному в AuthenticationProperties - PullRequest
0 голосов
/ 06 марта 2020

Заранее извиняюсь за мой Engli sh.

Мне нужно разработать веб-API, который использует Oauth 2.0 для аутентификации на внешнем сайте. Затем я должен использовать токен доступа, который мне возвращают для отправки запросов на тот же сайт. Я делаю тест с использованием github API.

Это класс запуска:

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
         // This lambda determines whether user consent for non-essential cookies is needed for a given request.
         options.CheckConsentNeeded = context => true;
         options.MinimumSameSitePolicy = SameSiteMode.None;
    });


    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    services.AddAuthentication(options =>
    {
         options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
         options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
         options.DefaultChallengeScheme = "GitHub";
    })
    .AddCookie()
    .AddOAuth("GitHub", options =>
    {
        options.ClientId = Configuration["GitHub:ClientId"];
        options.ClientSecret = Configuration["GitHub:ClientSecret"];
        options.CallbackPath = new PathString("/signin-github");

        options.AuthorizationEndpoint = "https://github.com/login/oauth/authorize";
        options.TokenEndpoint = "https://github.com/login/oauth/access_token";
        options.UserInformationEndpoint = "https://api.github.com/user";

        options.SaveTokens = true;

        options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
        options.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
        options.ClaimActions.MapJsonKey("urn:github:login", "login");
        options.ClaimActions.MapJsonKey("urn:github:url", "html_url");
        options.ClaimActions.MapJsonKey("urn:github:avatar", "avatar_url");

        options.Events = new OAuthEvents              
        {
            OnCreatingTicket = async context =>
            {
                Console.WriteLine("This is the access Token: " + context.AccessToken);
                var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);

                var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
                response.EnsureSuccessStatusCode();

                var user = JObject.Parse(await response.Content.ReadAsStringAsync());

                context.RunClaimActions(user);
            }
        };


    });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseAuthentication(); 

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller}/{action=Index}/{id?}");
        });
    }
}

с этим:

        options.SaveTokens = true;

токен должен быть сохранен в AuthenticationProperties, но в моем контроллере я не знаю, как получить доступ к токену, чтобы передать его в заголовки для запросов.

Единственное, что я нашел, - это устаревший метод, а именно:

var authenticateInfo = await HttpContext.Authentication.GetAuthenticateInfoAsync("Bearer");
string accessToken = authenticateInfo.Properties.Items[".Token.access_token"];

но у меня есть эта ошибка:

No authentication handler is configured to authenticate for the scheme: Bearer

Это мой типизированный клиент

public class Service
{
    public HttpClient Client { get;  }

    public Service(HttpClient client)
    {
        var token = GetTokenAsync();

        client.DefaultRequestHeaders.Add("Authorization", "");    //here I have to pass the access token

        client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");

        Client = client;
    }

    public async Task<string> GetTokenAsync()
    {
        //I want the access token returned to me

        return token;
    }

}

1 Ответ

0 голосов
/ 09 марта 2020

Вы можете получить токен доступа через:

var token = await HttpContext.GetTokenAsync("access_token");
...