2015-06-16 48 views
3

我无法通过C#控制台(桌面)应用程序调用Yahoo Gemini API来访问Yahoo Gemini广告。Oauth2 Yahoo Gemini API

下面是步骤我用:

  1. 创建于https://developer.yahoo.com/apps/create/安装的应用程序。这给了我{Client ID}{Client Secret}
  2. https://api.login.yahoo.com/oauth2/request_auth?client_id={Client ID} &redirect_uri=oob&response_type=code&language=en-us。这会将我带到我登录的yahoo登录屏幕。按“同意”按钮,下一个屏幕显示七字母​​授权码(例如nzbcns9)。我写下这个授权码。
  3. 然后我用下面的代码,试图获得访问令牌:

    class Program 
    { 
    static void Main(string[] args) 
    { 
        string clientId = {Client ID}; 
        string secret = {Client Secret}; 
    
        var request = WebRequest.Create(@"https://api.login.yahoo.com/oauth2/get_token"); 
        request.Method = "POST"; 
    
        SetBasicAuthHeader(request, clientId, secret); 
    
        string postData = "grant_type=authorization_code&redirect_uri=oob&code=nzbcns9"; 
        ASCIIEncoding encoding = new ASCIIEncoding(); 
        byte[] byte1 = encoding.GetBytes(postData); 
        request.ContentLength = byte1.Length; 
        Stream dataStream = request.GetRequestStream(); 
        dataStream.Write(byte1, 0, byte1.Length); 
        dataStream.Close(); 
    
        request.ContentType = "application/x-www-form-urlencoded"; 
        var response = request.GetResponse(); 
        Console.WriteLine(((HttpWebResponse)response).StatusDescription); 
    } 
    
    static void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) 
    { 
        string authInfo = userName + ":" + userPassword; 
        authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
        request.Headers["Authorization"] = "Basic " + authInfo; 
    } 
    } 
    

然后我得到

Unhandled Exception: System.Net.WebException: The remote server returned an error: (401) Unauthorized. at System.Net.HttpWebRequest.GetResponse().

我做了什么错?

我也尝试发布使用招相同的消息,我得到

{"error":"invalid_request"}

回答

1

我想你的代码,什么工作对我来说是放线request.ContentType = "application/x-www-form-urlencoded";Stream dataStream = request.GetRequestStream();

所以这个工作:

string postData = "grant_type=authorization_code&redirect_uri=oob&code=nzbcns9"; 
    ASCIIEncoding encoding = new ASCIIEncoding(); 
    byte[] byte1 = encoding.GetBytes(postData); 
    request.ContentLength = byte1.Length; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    Stream dataStream = request.GetRequestStream(); 
    dataStream.Write(byte1, 0, byte1.Length); 
    dataStream.Close(); 
+0

这对我不起作用。 API改变了,还是我错过了一些东西?使用上面的代码,我得到: \t \t远程服务器返回错误:(400)错误的请求。 – Foozinator

0

这两种都不适合我,但是它在我改变SetBasicAuthHeader使用ISO-8859-1编码后确实有效:

static void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) 
    { 
     string authInfo = userName + ":" + userPassword; 
     authInfo = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(authInfo)); 
     request.Headers[ "Authorization" ] = "Basic " + authInfo; 
    } 
+0

请注意,这将为您提供刷新令牌。验证码将在每次使用后过期,因此请保存刷新令牌并将其用作应用程序的起点。 – Foozinator