Моя цель - иметь Angular 8 SPA с серверным бэкэндом, представленным несколькими azure приложениями функций, использующими OAuth от Facebook, Google ...
У меня проблема с вызовом azure функций от имени авторизованных пользователей. Функция видит эти вызовы как анонимные пользователи.
Из браузера функция возвращает имя авторизованного пользователя, из вызова приложения браузера возвращает «нет имени», что означает, что пользователь не авторизован.
Я предполагаю, что сеанс с myapp.azurewebsites. net не виден в моем приложении, которое находится на localhost (это может быть любой другой домен). Кроме того, я не могу предоставить сеанс в запросе к конечной точке функции.
Итак, как можно авторизовать пользователей и вызывать функции azure из клиентского приложения в другом домене? Или это возможно только при ручной реализации токенов JWT с расширенной логикой c для всех функций? Кроме того, я не хочу платить сторонним службам, таким как Auth0 или даже AAD.
Джим Сюй предложил способ, который работает, но не для моего случая. Недостатки, которые я вижу:
- При таком подходе я не вижу имени пользователя и адреса электронной почты в основной записи претензий. Также не уверен, что я могу использовать в качестве идентификатора пользователя.
- Логины входа c будут распространяться на все приложения, использующие API.
- Потребуется хранить токен FB для аутентификации всех функций. apps
Я ищу ответы на следующие вопросы:
- Есть ли в моем случае аутентификация на основе бэкэнда?
- Есть ли возможность настроить post_login_redirect_url для получения токена также для обслуживания?
- Может быть, можно настроить через https://resources.azure.com/?
- Можно ли совместно использовать токен доступа для нескольких функциональных приложений? (Таким образом, логика пользовательского интерфейса c будет упрощена, чтобы получить доступ к app / .auth / login / provider и затем сохранить токен службы.)
Пример моего кода и конфигурации:
Вот основные части клиентского приложения, которые я использую для вызова:
<button (click)="call('https://myapp.azurewebsites.net/Function1')">CallWithoutAuth</button>
<button (click)="call('https://myapp.azurewebsites.net/Function2')">CallWithAuth</button>
<a href="https://myapp.azurewebsites.net/.auth/login/facebook?post_login_redirect_url=http%3A%2F%2Flocalhost%3A5000" target="_blank">Log in with Facebook</a>
Тело функции вызова:
var url = 'my azure func url with auth via facebook';
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
};
xhttp.onerror = function(e){console.log(e, this)};
xhttp.open("GET", url, true);
xhttp.send();
Код функции:
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "Func2")] HttpRequest req,
ClaimsPrincipal claimsPrincipal)
{
var name = claimsPrincipal?.Identity?.Name;
return (ActionResult)new OkObjectResult($"Hello, {name ?? "no name"}");
}
Вот настройки функций приложения:
![enter image description here](https://i.stack.imgur.com/vYtaD.png)
CORS config:
![enter image description here](https://i.stack.imgur.com/h8y0W.png)
Конфигурация Fasebook:
![enter image description here](https://i.stack.imgur.com/K5MqG.png)