Как обновить токен поставщика внешнего входа в систему, если Instagram API отправляет OAuthAccessTokenException в .Net Core 2.1? - PullRequest
0 голосов
/ 14 января 2019

Мы разрабатываем веб-приложение .net core 2.1, и оно использует Instagram API для функций входа в систему и регистрации при необходимости (потому что наш целевой рынок сильно зависит от пользователей Instagram). Но у меня проблема с истечением срока действия токена API Instagram.

Следуя кодам, как мы регистрируем пользователей в .net core с помощью instagram api;

public async Task<IActionResult> RegisterUserWithInstagram(string code)
    {
        const string RedirectURI = "https://localhost:44341/RegisterUserWithInstagram";

        // get user data from Instagram
        var authResponse = _instagramService.InstagramAuth(code, RedirectURI);

        var user = new IdentityUser
        {
            UserName = username
        };
        var userResult = await _userManager.CreateAsync(user);
        if (userResult.Succeeded)
        {
            var newUser = _userService.CreateUser(user, authResponse.user.full_name);
            await _userManager.AddLoginAsync(user, new UserLoginInfo("Instagram", authResponse.access_token, "Instagram"));
            await _userManager.AddToRoleAsync(user, "User");
            TattooUser tattooUser = new TattooUser();
            tattooUser.UserAccount = newUser;
            _userService.AddUser(tattooUser);
        }

        return RegisterUser();
    }

Следуя кодам, как мы регистрируем пользователей в .net core с помощью instagram api;

public async Task<IActionResult> LoginWithInstagram(string code)
    {
        const string RedirectURI = "https://localhost:44341/LoginWithInstagram";

        // get user data from Instagram
        var authResponse = _instagramService.InstagramAuth(code, RedirectURI);

        var user = await _userManager.FindByLoginAsync("Instagram", authResponse.access_token);

        // (*)
        if (user != null)
        {
            var result = await _signInManager.ExternalLoginSignInAsync("Instagram", authResponse.access_token, true);
            // (**)

            if (result.Succeeded)
            {
                // redirect to pages according user's role here
            }
        }
        return Redirect("/Home/Index");
    }

Проблемы :

(*) пользователь имеет значение NULL, потому что с помощью ответа от auti-ins api возвращает новый access_token, а у моего пользователя истек срок действия в базе данных.

(**) , но чтобы изменить текущий access_token пользователя в таблице AspNetUserLogins, мне нужно сначала получить IdentityUser. Но я не могу получить его, потому что мне нужен правильный access_token, чтобы получить пользователя. см;

var user = await _userManager.FindByLoginAsync("Instagram", authResponse.access_token);

Мой вопрос в том, как вы, ребята, решаете эту проблему в своих приложениях, будь то Instagram или какие-либо другие внешние провайдеры входа в систему? И в каком ответе OAuthAccessTokenException отправляется как ошибка, как отмечалось в Instagram Api Doc;

Несмотря на то, что в наших токенах доступа не указано время истечения, ваше приложение должно обрабатывать случай, когда пользователь отменяет доступ, или Instagram истекает токен через некоторый период времени. Если токен больше не действителен, ответы API будут содержать «error_type = OAuthAccessTokenException». В этом случае вам нужно будет повторно пройти аутентификацию пользователя, чтобы получить новый действительный токен. Другими словами: не думайте, что ваш access_token действителен вечно.

Edit: Моя функция InsgramAuth на InstagramService;

public JsonInstagramAuthResponse InstagramAuth(string code, string RedirectURI)
    {
        NameValueCollection parameters = new NameValueCollection();
        parameters.Add("client_id", ClientID);
        parameters.Add("client_secret", ClientSecret);
        parameters.Add("grant_type", "authorization_code");
        parameters.Add("redirect_uri", RedirectURI);
        parameters.Add("code", code);

        WebClient client = new WebClient();
        var result = client.UploadValues("https://api.instagram.com/oauth/access_token", "POST", parameters);
        var response = System.Text.Encoding.Default.GetString(result);

        // get user data from Instagram
        return JsonConvert.DeserializeObject<JsonInstagramAuthResponse>(response);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...