.Net Core OAuth Вложенные заявки не отображаются обратно пользователю - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь получить доступ к заявкам после OAuth:

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

    options.AuthorizationEndpoint = "https://www.coinbase.com/oauth/authorize";
    options.TokenEndpoint = "https://api.coinbase.com/oauth/token";
    options.UserInformationEndpoint = "https://api.coinbase.com/v2/user";

    options.SaveTokens = true;

    options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
    options.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
    options.ClaimActions.MapJsonKey("urn:coinbase:avatar", "avatar_url");

    options.Events = new OAuthEvents
    {
        OnCreatingTicket = async context =>
        {
            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);
            request.Headers.Add("CB-VERSION", DateTime.Now.ToShortDateString()); 
            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);
        }
    };
});

Насколько я понимаю, после получения токена доступа в OnCreatingTicket я получаю пользователя через UserEndpoint.Когда я вызываю context.RunClaimActions(user), это должно сопоставить утверждения, которые я установил в моих настройках, с моим пользователем.

В модели «Мой индекс» я пытаюсь получить сопоставленные утверждения следующим образом:

public class IndexModel : PageModel
{
    public string CoinbaseId { get; set; }

    public string CoinbaseAvatar { get; set; }

    public string CoinbaseName { get; set; }

    public async Task OnGetAsync()
    {
        if (User.Identity.IsAuthenticated)
        {
            CoinbaseName = User.FindFirst(c => c.Type == ClaimTypes.Name)?.Value;
            CoinbaseId = User.FindFirst(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
            CoinbaseAvatar = User.FindFirst(c => c.Type == "urn:coinbase:avatar")?.Value;

        }
    }

Тем не менее модель возвращает все нулевые значения.Мой ответ от coinbase содержит все 3 из этих утверждений, но, похоже, они не отображаются в моем пользовательском запоминающем устройстве, кто-нибудь знает почему?

EDIT

Оказывается, Coinbase не возвращает объект пользователя напрямую, он возвращает объект пользователя, завернутый в объект с именем Data.

Я пытался добавить префикс моей карты к

options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "data.id"); 

Я думаю, мне нужно будет проанализировать объект данных вручную

1 Ответ

0 голосов
/ 30 октября 2018

Чтобы исправить это, я просто взял вложенное свойство в JObject с помощью SelectToken

var userData = JObject.Parse(await response.Content.ReadAsStringAsync());
var user = userData["data"];

context.RunClaimActions(JObject.FromObject(user));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...