Как использовать петлевой IP для получения токена авторизации - PullRequest
0 голосов
/ 22 мая 2019

Недавно Google запретил авторизацию встроенного браузера в пользу Loopback IP подход

Мой сайт имеет настольный клиент, который использует ту же систему входа в систему, что и веб-сайт. По сути, я открываю встроенный браузер на свой веб-сайт и беру файл cookie после завершения входа. Затем файл cookie для моего сайта используется для доступа к API настольным клиентом.

Теперь, когда Google запрещает встроенный браузер, мне нужен новый подход для этого (если я хочу сохранить внешний вход в Google).

Если я правильно понимаю, новый процесс будет выглядеть примерно так:
1. Настольный клиент слушает localhost::port
2. Настольный клиент запускает URL-адрес страницы входа на веб-сайт и открывает браузер пользователя по умолчанию
3. Вход пользователя на сайт с использованием их любимого браузера
4. веб-сервер обнаруживает успешный вход в систему и каким-то образом отправляет перенаправление с токеном авторизации на localhost::port
5. Настольный клиент читает токен с localhost

Но как я могу показать страницу успешного входа в систему, чтобы дать пользователю команду закрыть браузер и вернуться в приложение для настольного компьютера, если URL-адрес перенаправления - localhost? Как мне реализовать это как на сервере, так и на настольном клиенте?

1 Ответ

0 голосов
/ 24 мая 2019

Нашел два способа сделать это. Одним из них является использование TcpListener и привязка к Loopback IP. Ответ возвращается в виде потока, который вам понадобится для дальнейшего анализа, чтобы получить нужные данные, и это огромная боль.

Другой способ - использовать HttpListener

        using (HttpListener listener = new HttpListener())
        {
            listener.Prefixes.Add("http://localhost:{port}/"); //Only listen to this particular address
            listener.Start();

            //blocking call. Feel free to use async version
            HttpListenerContext context = listener.GetContext(); 
            HttpListenerRequest request = context.Request;

            HttpListenerResponse response = context.Response;

            //Here is the response url. The token should be inside url query param.
            Console.WriteLine(request.Url); 

            //redirects user back to your site and show a login success screen
            response.Redirect("{yourdomain}/loginsuccess");
            //Important! call close to send out the response
            response.Close();

            //Important! If listener is stopped before response is sent out then it will abort.
            Thread.Sleep(1000);
            listener.Stop();
        }

На стороне сервера просто перенаправьте пользователя на http://localhost:{port}/?token=xxxx после завершения входа в систему.

реализация asp.net:

В Startup.Auth.cs добавить статическое поле

public static TicketDataFormat AccessTokenFormat;

в ConfigureAuth до

AccessTokenFormat = new TicketDataFormat(app.CreateDataProtector(typeof(OAuthAuthorizationServerMiddleware).Namespace, "Access_Token", "v1"));

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

Для генерации токена

    TimeSpan tokenExpiration = TimeSpan.FromDays(1);

    ClaimsIdentity identity = new ClaimsIdentity(OAuthDefaults.AuthenticationType);
    identity.AddClaim(new Claim(ClaimTypes.Name, "a@a.com"));
    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, "999"));

    AuthenticationProperties props = new AuthenticationProperties()
    {
        IssuedUtc = DateTime.UtcNow,
        ExpiresUtc = DateTime.UtcNow.Add(tokenExpiration),
    };

    AuthenticationTicket ticket = new AuthenticationTicket(identity, props);

    string accessToken = Startup.AccessTokenFormat.Protect(ticket);

С помощью этого метода пользователь даже не заметит, что мы переадресовали его / ее на localhost. URL браузера будет показывать домен вашего сайта все время.

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