我正在尝试按照以下说明调用 Google 的 OAuth2 身份验证服务:https ://developers.google.com/accounts/docs/OAuth2ForDevices
我将所有必需的参数放入查询字符串并发送请求。这适用于“获取用户代码”部分,但不适用于“获取访问和刷新令牌”部分。
在玩了很多游戏并收到 400 Bad Request 错误之后,我发现,您可以使用 FormUrlEncodedContent 创建一个请求,并使用 application\x-www-form-urlencoded 将数据作为内容发送,而不是将数据放入查询字符串中内容类型。
这是之前的代码:
var requestMessage = new HttpRequestMessage();
requestMessage.Method = "POST";
requestMessage.RequestUri = new Uri(fullUrl);
fullUrl 类似于:
https://accounts.google.com/o/oauth2/device/code?client_id=812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile
新代码是:
var requestMessage = new HttpRequestMessage();
requestMessage.Method = "POST";
requestMessage.RequestUri = new Uri(url);
requestMessage.Content = new FormUrlEncodedContent(CreateDictionary(queryStringNames, queryStringValues));
网址在哪里:
https://accounts.google.com/o/oauth2/device/code
queryStringNames 和 queryStringValues 是所需参数的名称和值的字符串数组。
这两种方法有什么区别?假设所有 POST 调用都可以使用 URL 编码内容请求而不是将数据放入查询字符串中,这是否安全?