我尝试发送OAuth请求,但在选择帐户后总是收到此错误。
这是我尝试过的,我读到状态应该是随机生成的,但我仍然得到错误。
public static string GetOauthUri(string state, string ClientId)
{
StringBuilder sbUri = new StringBuilder(OauthUri);
sbUri.Append("client_id=" + ClientId);
sbUri.Append("&redirect_uri=" + RedirectUri);
sbUri.Append("&response_type=" + "code");
sbUri.Append("&scope=" + Scopes);
Random random = new Random();
string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
sbUri.Append("&state=" + new string(Enumerable.Repeat(chars, 8).Select(s => s[random.Next(s.Length)]).ToArray()));
sbUri.Append("&access_type=" + "offline");
sbUri.Append("&approval_prompt=" + "force");
return sbUri.ToString();
}
即使我省略了状态,我也会得到错误。
1条答案
按热度按时间g9icjywg1#
如果您查看Oauth2.0 rfc(https://www.rfc-editor.org/rfc/rfc6749#section-4.1.1),您可以看到您的请求应该如下所示:
状态应该从 * 客户端 * 传递(步骤(A)),然后传递到 * 用户代理 *,然后传递到 * 授权 * 服务器。我怀疑状态应该由您的实现中的客户端生成。
授权服务器验证请求,以确保所有必需的参数都存在且有效。如果请求有效,则授权服务器对资源所有者进行身份验证,并获得授权决定(通过询问资源所有者或通过其他方式建立批准)。
服务器实现很可能会检查特定的状态输入,但您不知道是哪一个。您应该从服务开发人员/维护人员那里获得有关此问题的信息。如果他们没有时间正确实现此功能,他们可能会使用RCF 'xyz'的示例值作为伪参数值。
同时尝试更改参数顺序以匹配rfc示例并避免多个作用域,因为使用空格的作用域串联有时可能会被服务器“剪切”其他key=values对而误解。