Вам повезло, я проходил через ту же самую проблему раньше, и мне потребовались недели, чтобы решить ее.Чтобы получить токен доступа и токен обновления, вам нужно использовать библиотеку Microsoft MSAL вместо ADAL.Нет абсолютно никакого способа обновить ваш токен без использования MSAL.Библиотека MSAL от Microsoft бесполезна.Я написал упрощенную версию с нуля специально для моего приложения Angular.Я загрузил его в GitHub для вас. MsalService.ts .Надеемся, что вы можете использовать его.
Обычно, когда вам нужен токен аутентификации, используйте функцию msalService.acquireToken
.Если токен не возвращается из этой функции, пользователь должен выйти из системы.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Вы не можете запросить токен доступа или обновить токен со стороны клиента вашего приложения из-за ограничений CORS.Я создал конечные точки на своем сервере для выполнения запросов.
[HttpPost, Route("AccessToken")]
public async Task<HttpResponseMessage> GetAccessToken(AccessTokenRequest accessTokenRequest)
{
HttpClient httpClient = new HttpClient();
var content = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("grant_type", "authorization_code"),
new KeyValuePair<string, string>("client_id", "<insert_your_client_id>"),
new KeyValuePair<string, string>("code", accessTokenRequest.AuthorizationCode),
new KeyValuePair<string, string>("redirect_uri", RemoveHashFromUri(accessTokenRequest.RedirectUri)),
new KeyValuePair<string, string>("client_secret", "<insert_your_client_secret>"),
new KeyValuePair<string, string>("scope", accessTokenRequest.Scope)
};
var response = await httpClient.PostAsync($"https://login.microsoftonline.com/{your_tenant_id}/oauth2/v2.0/token", new FormUrlEncodedContent(content));
return response;
}
[HttpPost, Route("RefreshToken")]
public async Task<HttpResponseMessage> RefreshToken(AccessTokenRequest accessTokenRequest)
{
HttpClient httpClient = new HttpClient();
var content = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("grant_type", "refresh_token"),
new KeyValuePair<string, string>("client_id", "<insert_your_client_id>"),
new KeyValuePair<string, string>("refresh_token", accessTokenRequest.AuthorizationCode),
new KeyValuePair<string, string>("client_secret", "<insert_your_client_secret>"),
};
var response = await httpClient.PostAsync($"https://login.microsoftonline.com/{your_tenant_id}/oauth2/v2.0/token", new FormUrlEncodedContent(content));
return response;
}
private string RemoveHashFromUri(string redirectUri)
{
if (string.IsNullOrWhiteSpace(redirectUri))
{
return null;
}
if (redirectUri.Contains("#"))
{
return redirectUri.Substring(0, redirectUri.IndexOf("#"));
}
return redirectUri;
}
public class AccessTokenRequest
{
public string AuthorizationCode { get; set; }
public string RedirectUri { get; set; }
public string Scope { get; set; }
}
В конструкторе или ngOnInit () компонента вашего приложения вам нужен этот код для обработки обратного вызова, когда пользователь фактически входит в Microsoft.С токеном, возвращенным из Microsoft в хеше URL, вы можете получить токен доступа.
let authorizationCallback: IAuthorizationCallback = this.msalService.processAuthorizationCallback();
if (authorizationCallback.code) {
// call out to your server for an access token
this.resourceFactory.create("Auth/AccessToken").post({
authorizationCode: authorizationCallback.code,
redirectUri: this.msalService.getRedirectUrl(),
scope: this.msalService.getScopes()
}).then((json: any) => {
try {
this.msalService.cacheAuthentication(json);
} catch (error) {
// handle error
}
}).catch((error: any) => {
// handle error
});
} else if (authorizationCallback.error) {
// handle error. Check authorizationCallback.error and authorizationCallback.error_description
}
Дайте мне знать, если у вас возникнут проблемы.