質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

2回答

2835閲覧

【.NET Standard】【C#】HttpClient で OAuth2 の API コールをする方法

Daiki-Kawanuma

総合スコア29

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

1グッド

1クリップ

投稿2017/12/13 03:57

.NET Standard 2.0(検証環境は .NET Standard 2.0 Xamarin.Forms プロジェクト)で OAuth2 の API コールを行いたいです。
現状、以下のようなコードを書いております。

C#

1using System; 2using System.Collections.Generic; 3using System.IO; 4using System.Linq; 5using System.Net.Http; 6using System.Net.Http.Headers; 7using System.Text; 8using System.Threading.Tasks; 9 10private const string Url = "https://s3-api.us-geo.objectstorage.softlayer.net/myimages/"; 11private const string Bearer = "Bearer eyJraWQiOiIyMDE3MTAzMC0wMDowMDowMfjqwoplaAgw..."; 12 13public void UploadFile(Stream stream) 14{ 15 16 var content = new MultipartFormDataContent(); 17 18 // Stream を byte[] に変換 19 var imageByteArray = ReadFully(stream); 20 21 var imageContent = new ByteArrayContent(imageByteArray); 22 imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg"); 23 content.Add(imageContent); 24 25 var httpClient = new HttpClient(); 26 /** 色々試してみました **/ 27 //httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded") { CharSet = "UTF-8" }); 28 //httpClient.DefaultRequestHeaders.Add("Authorization", Bearer); 29 //httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", Bearer); 30 httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", Bearer); 31 32 var response = httpClient.PutAsync(Url + "test", content).Result; 33}

上記コードの結果としては、"Connection reset by peer" というエラーになります。
https://msdn.microsoft.com/en-us/library/ms847613.aspx

問題の切り分けとして、以下のように curl で叩いた場合は成功しています。

curl

1curl -X "PUT" "https://s3-api.us-geo.objectstorage.softlayer.net/myimages/test" \ 2 -H "Authorization: Bearer eyJraWQiOiIyMDE3MTAzMC0wMDowMDowMfjqwoplaAgw..." \ 3 -H "Content-Type: image/jpeg" \ 4 -d "test.jpg"

OAuth2 の認証で弾かれていると推測していますが、正しい書き方はどのようになりますでしょうか?
ご教授のほど、よろしくお願い致します。

amay077👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。田淵です。

private const string Bearer = "eyJraWQiOiIyMDE3MTAzMC0wMDowMDowMfjqwoplaAgw...";

に変更して、

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Bearer);

じゃないですかね。

投稿2017/12/13 06:32

編集2017/12/13 06:33
ytabuchi

総合スコア335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daiki-Kawanuma

2017/12/14 15:08

まず、田淵さんにご指摘いただきました通り、 httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Bearer); が正しい記述でした。 しかしながらエラーの直接的な原因はこれではなく、 Mono 実装の HttpClient を利用していたことが直接的な原因でした。 Android 実装の HttpClient に切り替え、田淵さんに記述いただいたコードに変更した結果、通るようになりました。やっぱ Xamarin 難しいですね
ytabuchi

2017/12/14 15:10

お!解決したならよかった!!
guest

0

Xamarin.Forms や IBM Cloud の環境が無いので直接の回答ではありませんが、
FiddlerやCharlsやBurp Suite等のWebプロキシをインストールし、実際に送信されるHTTPヘッダ、ボディを見てみると良いと思います。
(私個人としてWindows上ではFiddlerがおすすめです)

HttpClient にプロクシを設定する方法

c#

1var handler = new HttpClientHandler(); 2handler.UseProxy = true; 3handler.Proxy = new WebProxy("127.0.0.1", 8008); 4 5var httpClient = new HttpClient(handler);
実行結果

C#

1httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", Bearer);

このコードの場合Authorizationヘッダが明らかにおかしい事が分かります。

投稿2017/12/13 05:27

aglkjggg

総合スコア769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daiki-Kawanuma

2017/12/14 15:10

ご回答いただきましてありがとうございました。 ご提案いただきました Fiddler でキャプチャーしてみた結果、そもそも OAuth まで行っていないことが分かりました。 直接的な原因は Mono の実装でしたが、問題の切り分けとして、aglkjggさんのご指摘はとても助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問