55061


.net framework4.0を使用しています。  
EPOサイトのAPIを使用する為にアクセストークンを取得したいのですが、  
下記コードのwebRequest.GetResponse()の箇所で  
「接続が切断されました: 送信時に、予期しないエラーが発生しました。」  
のエラーが出てしまいます。  
どの様に修正すれば良いでしょうか。

[code]

    const string CONSUMER_KEY = "xxxxxxx";
    const string CONSUMER_SECRET_KEY = "xxxxxxxx";
    WebResponse response = null;
    try {
        WebRequest webRequest = WebRequest.Create("https://ops.epo.org/3.2/auth/accesstoken");
        string key = Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Concat(CONSUMER_KEY, ":", CONSUMER_SECRET_KEY)));
        webRequest.Headers.Add("Basic%s", key);
        webRequest.Method = "POST";
        webRequest.ContentType = "application/x-www-form-urlencoded";
        byte[] postDataBytes = Encoding.ASCII.GetBytes(key);
        using(Stream reqStream = webRequest.GetRequestStream()) {
            reqStream.Write(postDataBytes, 0, postDataBytes.Length);
        }
        string accessToken = "";
        using(WebResponse webResponse = webRequest.GetResponse()) {
            System.IO.Stream stream = webResponse.GetResponseStream();
            System.IO.StreamReader streamReader = new StreamReader(stream);
            accessToken = streamReader.ReadToEnd();
        }
    } catch {
    } finally {
        if(response != null) {
            response.Close();
            response = null;
        }
    }
    
[/code]


CC BY-SA 4.0
2019-05-17T10:08:31.340
55059
2019-05-18T02:55:34.000
25725
question
c# oauth
VS2010のC#でEPOのOAuthにアクセス出来ない


OAuthの仕様では、リクエスト・ヘッダーに次のような値をセットしてアクセストークンを取得しますが、

[code]

    Authorization: Basic [Base64エンコードしたクライアントIDとシークレット]
    
[/code]

この実装では、

[code]

    webRequest.Headers.Add("Basic%s", key);
    
[/code]

なので、おそらくリクエスト・ヘッダーが以下のようになってしまいます。

[code]

    Basic%s: [Base64エンコードしたクライアントIDとシークレット]
    
[/code]

「接続が切断されました: 送信時に、予期しないエラーが発生しました。」のエラーの原因ではないかもしれませんが、少なくとも上記行はこう修正すべきです。

[code]

    webRequest.Headers.Add("Authorization", "Basic " + key);
    
[/code]

それから、

[code]

    byte[] postDataBytes = Encoding.ASCII.GetBytes(key);
    
[/code]

これは`key`ではなく、`grant_type=client_credentials`をPOSTすべきですね。

[code]

    byte[] postDataBytes = Encoding.ASCII.GetBytes("grant_type=client_credentials");
    
[/code]

追記：  
[仕様](http://documents.epo.org/projects/babylon/eponet.nsf/0/F3ECDCC915C9BCD8C1258060003AA712/$File/ops_v3.2_documentation_-
_version_1.3.81_en.pdf)がありました。P35あたりです。


CC BY-SA 4.0
2019-05-17T11:50:40.693
55061
2019-05-18T02:55:34.000
2019-05-18T02:55:34.000
21092
21092
55059
answer