Нужно сгенерировать мой собственный 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");
}
};
};
}