Как создать JwtToken в обратном вызове OAuth - PullRequest
0 голосов
/ 25 июня 2019

Нужно сгенерировать мой собственный JwtToken в обратном вызове OAuth после доступа к конечной точке информации о пользователе

У меня есть приложение, работающее в AngularJS с некоторыми API в .NetCore. Мне нужно использовать сервер OAuth для аутентификации. Сервер OAuth сначала возвращает токен доступа. С помощью маркера доступа я получаю доступ к конечной точке информации о пользователе, чтобы получить информацию о пользователе. После этого мне нужно сгенерировать мой JwtToken и вернуть его в пользовательский интерфейс, чтобы я мог сохранить его в локальном хранилище и отправлять при каждом вызове API.

Я знаю, как генерировать JwtToken, но я не знаю, как отправить его обратно в пользовательский интерфейс в конце метода обратного вызова. Я даже не знаю, является ли это правильным способом сделать это. Я не могу сделать все это в пользовательском интерфейсе, потому что мой OAuth-сервер требует клиента и секрета, которых у меня не может быть на стороне пользовательского интерфейса.

       services.AddAuthentication()
        .AddJwtBearer("JwtToken", options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = false,
                ValidateAudience = false,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                //ValidIssuer = Configuration["Jwt:Issuer"],
                // ValidAudience = Configuration["Jwt:Issuer"],
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("my key"))
           };
           options.ForwardDefault = oauth.Name;
        })
        .AddOAuth(oauth.Name, AuthConfiguration(oauth))


    private System.Action<OAuthOptions> AuthConfiguration(AuthConfiguration auth)
    {
        return options =>
        {
            // Configure the Auth0 Client ID and Client Secret
            options.ClientId = auth.ClientID;
            options.ClientSecret = auth.Secret;

            options.CallbackPath = new PathString(auth.Callback);

            // Configure the Auth0 endpoints
            options.AuthorizationEndpoint = auth.AuthorizationEndpoint;
            options.TokenEndpoint = auth.TokenEndpoint;
            options.UserInformationEndpoint = auth.UserInformationEndpoint;

            // To save the tokens to the Authentication Properties we need to set this to true
            // See code in OnTicketReceived event below to extract the tokens and save them as Claims
            //options.SaveTokens = true;

            // Set scope to openid. See https://auth0.com/docs/scopes
            options.Scope.Clear();
            options.Scope.Add("openid");
            options.Scope.Add("profile");

            options.Events = new OAuthEvents
            {
                // When creating a ticket we need to manually make the call to the User Info endpoint to retrieve the user's information,
                // and subsequently extract the user's ID and email adddress and store them as claims
                OnCreatingTicket = async context =>
                {
                        //// Retrieve user info
                        var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
                        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);
                        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

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

                        // Extract the user info object
                        var user = JObject.Parse(await response.Content.ReadAsStringAsync());

                        // Add the Name Identifier claim
                        var userId = user.Value<string>("sub");
                        if (!string.IsNullOrEmpty(userId))
                        {
                            context.Identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userId, ClaimValueTypes.String, context.Options.ClaimsIssuer));
                        }

                        // Add the Name claim
                        email = user.Value<string>("email");

                }
            };
        };
    }

1 Ответ

0 голосов
/ 25 июня 2019

Создайте контроллер и добавьте вызов к этому коду в качестве метода GET на этом контроллере. Он вернет строку, сгенерированную вашим методом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...