Я пытаюсь узнать, как реализовать функцию входа в систему Googles Oauth2 SSO. До сих пор я дошел до того, что все работает, за исключением случаев, когда я пытаюсь отправить запрос на "https://accounts.google.com/o/oauth2/token", используя REST в C #, чтобы получить Access_code / Token. Я зарегистрировал свой локальный хост и соответствующий порт на Google и мне удалось заставить мой запрос POST работать в POSTMAN, однако, когда я пытаюсь отправить запрос в C #, мое HttpRequestMessage возвращает 400 неверных запросов.
Сначала у меня есть страница Authorization.aspx, которая запускает команду, которая перенаправляет пользователей на страницу авторизации googles, где пользователь входит в систему, а затем перенаправляется на мою страницу http://localhost:64716/GoogleCallBack.aspx, которая принимает ответ. На странице он берет код авторизации и пытается отправить запрос POST на базовый URL. Я попытался запустить его в POSTMAN, где он работает (хотя только с новым кодом авторизации). Так что я знаю, что это мой код C #, который является проблемой. Я пытался использовать веб-запрос, а также пытался изменить тип носителя на application / Json и application / x-www-form-urlencoded
protected void Page_Load(object sender, EventArgs e)
{
string Error = Request.QueryString["error"];
string Code = Request.QueryString["code"];
if (Error != null) { }
else if (Code != null)
{
string UserId = Request.QueryString["state"];
int Id = Convert.ToInt32(UserId);
string AccessToken = string.Empty;
string RefreshToken = ExchangeAuthorizationCode(Id, Code, out AccessToken);
string Url = "Authorize.aspx?UserId=" + UserId;
Response.Redirect(Url, true);
}
}
private string ExchangeAuthorizationCode(int userId, string code, out string accessToken)
{
string baseurl = "https://accounts.google.com/o/oauth2/token";
accessToken = string.Empty;
string ClientSecret = ConfigurationManager.AppSettings["ClientSecrete"];
string ClientId = ConfigurationManager.AppSettings["ClientId"];
string RedirectUrl = "http://localhost:64716/GoogleCallBack.aspx";
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(baseurl);
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/Json"));
var nvc = new List<KeyValuePair<string, string>>();
nvc.Add(new KeyValuePair<string, string>("Code", code));
nvc.Add(new KeyValuePair<string, string>("Client_id", ClientId));
nvc.Add(new KeyValuePair<string, string>("Client_secret", ClientSecret));
nvc.Add(new KeyValuePair<string, string>("Redirect_uri", RedirectUrl));
nvc.Add(new KeyValuePair<string, string>("Grant_type", "authorization_code"));
nvc.Add(new KeyValuePair<string, string>("access_type", "offline"));
var req = new HttpRequestMessage(HttpMethod.Post, client.BaseAddress) { Content = new FormUrlEncodedContent(nvc) };
var resres = client.SendAsync(req).Result;
return "temp";
}
}
Я хочу, чтобы моим ответом был статускод 200 с маркером доступа от Google (как в Почтальоне)