交换授权代码以获取刷新和访问令牌OAuth2

时间:2019-12-17 10:56:18

标签: c# .net oauth-2.0 google-drive-api httpwebrequest

我正在尝试将在文档this step中获得的授权代码交换为刷新和访问令牌。我遇到的问题是如何发送对Json的请求,该请求包含here中所述的访问和刷新令牌。

这是我的代码:

string paras = string.Format("code={0}&client_id={1}&client_secret={2}&grant_type={4}&redirect_uri={3}",
    AuthCode,
    ClientID,
    ClientSecret,
    "urn:ietf:wg:oauth:2.0:oob",
    "authorization_code"
);
var req = WebRequest.Create("https://www.googleapis.com/oauth2/v4/token/") as HttpWebRequest;
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
byte[] data = Encoding.UTF8.GetBytes(paras);
req.ContentLength = data.Length;
using (Stream stream = req.GetRequestStream())
    stream.Write(data, 0, data.Length);
req.GetResponse();

System.Net.WebException: 'The remote server returned an error: (400) Bad Request.'被扔到req.GetResponse();

我的两个理论是我需要在开发人员控制台中添加重定向uri并使用它或添加代码验证程序。

2 个答案:

答案 0 :(得分:1)

https://accounts.google.com/o/oauth2/v2/auth发出请求以启动OAuth2流并获取Auth Code(OAuth 2.0 Step 2)时,redirect_uri参数接受特殊的urn:ietf:wg:oauth:2.0:oob URI来指定手动复制/粘贴获得的响应。

但是,在OAuth 2.0 Step 5(将身份验证代码交换为刷新和访问令牌)中,redirect_uri参数接受上述URI,因此您必须使用在您的GCP项目中已设置的有效密码(您可以通过转到凭据>您的凭证>授权的重定向URI添加一个密码)。

此外,为了调试API返回的响应错误,建议您检出this link,其中介绍了如何获取和打印与失败请求一起返回的信息。

答案 1 :(得分:1)

redirect_uri必须与when the authorization code was requested相同。

我也错过了this stepcode_challenge可以与code_verifier相同,但前提是code_challenge_methodplain。该文档说,仅在以后需要时才“建议”请求授权码。