OSDN Git Service

GAE型のAPI ProxyでOAuthが使えるように対応
authorkiri_feather <kiri_feather@users.sourceforge.jp>
Mon, 31 May 2010 13:30:56 +0000 (13:30 +0000)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 18 Feb 2012 14:13:02 +0000 (23:13 +0900)
git-svn-id: http://svn.sourceforge.jp/svnroot/tween/trunk@410 e39ad16e-3079-482e-bb30-4b4d378143b6

Tween/Connection/HttpConnectionOAuth.vb
Tween/Connection/HttpOAuthApiProxy.vb [new file with mode: 0644]
Tween/Connection/HttpTwitter.vb
Tween/Tween.vbproj

index 34879aa..cf60e4d 100644 (file)
@@ -43,7 +43,7 @@ Public Class HttpConnectionOAuth
     '''<summary>
     '''OAuthの署名作成用秘密コンシューマーデータ
     '''</summary>
-    Private consumerSecret As String
+    Protected consumerSecret As String
 
     '''<summary>
     '''認証成功時の応答でユーザー情報を取得する場合のキー。設定しない場合は、AuthUsernameもブランクのままとなる
diff --git a/Tween/Connection/HttpOAuthApiProxy.vb b/Tween/Connection/HttpOAuthApiProxy.vb
new file mode 100644 (file)
index 0000000..42f042e
--- /dev/null
@@ -0,0 +1,46 @@
+Imports System.Security
+Imports System.Text
+
+Public Class HttpOAuthApiProxy
+    Inherits HttpConnectionOAuth
+
+    Private Const _apiHost As String = "api.twitter.com"
+    Private Shared _proxyHost As String = ""
+
+    Friend Shared WriteOnly Property ProxyHost As String
+        Set(ByVal value As String)
+            If String.IsNullOrEmpty(value) OrElse value = _apiHost Then
+                _proxyHost = ""
+            Else
+                _proxyHost = value
+            End If
+        End Set
+    End Property
+
+    Private Function CreateSignature(ByVal tokenSecret As String, _
+                                            ByVal method As String, _
+                                            ByVal uri As Uri, _
+                                            ByVal parameter As Dictionary(Of String, String) _
+                                        ) As String
+        'パラメタをソート済みディクショナリに詰替(OAuthの仕様)
+        Dim sorted As New SortedDictionary(Of String, String)(parameter)
+        'URLエンコード済みのクエリ形式文字列に変換
+        Dim paramString As String = CreateQueryString(sorted)
+        'アクセス先URLの整形
+        Dim url As String = String.Format("{0}://{1}{2}", uri.Scheme, uri.Host, uri.AbsolutePath)
+        '本来のアクセス先URLに再設定(api.twitter.com固定)
+        If Not String.IsNullOrEmpty(_proxyHost) AndAlso url.StartsWith(uri.Scheme + "://" + _proxyHost) Then
+            url = url.Replace(uri.Scheme + "://" + _proxyHost, uri.Scheme + "://" + _apiHost)
+        End If
+        '署名のベース文字列生成(&区切り)。クエリ形式文字列は再エンコードする
+        Dim signatureBase As String = String.Format("{0}&{1}&{2}", method, UrlEncode(url), UrlEncode(paramString))
+        '署名鍵の文字列をコンシューマー秘密鍵とアクセストークン秘密鍵から生成(&区切り。アクセストークン秘密鍵なくても&残すこと)
+        Dim key As String = UrlEncode(consumerSecret) + "&"
+        If Not String.IsNullOrEmpty(tokenSecret) Then key += UrlEncode(tokenSecret)
+        '鍵生成&署名生成
+        Dim hmac As New Cryptography.HMACSHA1(Encoding.ASCII.GetBytes(key))
+        Dim hash As Byte() = hmac.ComputeHash(Encoding.ASCII.GetBytes(signatureBase))
+        Return Convert.ToBase64String(hash)
+    End Function
+
+End Class
index 172237d..606f585 100644 (file)
@@ -43,7 +43,7 @@ Public Class HttpTwitter
                                     ByVal accessTokenSecret As String, _
                                     ByVal username As String)
         'for OAuth
-        Dim con As New HttpConnectionOAuth
+        Dim con As New HttpOAuthApiProxy
         con.Initialize(ConsumerKey, ConsumerSecret, accessToken, accessTokenSecret, username, "screen_name")
         httpCon = con
         connectionType = AuthMethod.OAuth
@@ -458,6 +458,7 @@ Public Class HttpTwitter
     Public Shared WriteOnly Property TwitterUrl() As String
         Set(ByVal value As String)
             _twitterUrl = value
+            HttpOAuthApiProxy.ProxyHost = value
         End Set
     End Property
 
index f934734..780000b 100644 (file)
@@ -88,6 +88,7 @@
     <Compile Include="AtIdSupplement.vb">
       <SubType>Form</SubType>
     </Compile>
+    <Compile Include="Connection\HttpOAuthApiProxy.vb" />
     <Compile Include="Connection\HttpConnection.vb" />
     <Compile Include="Connection\HttpConnectionBasic.vb" />
     <Compile Include="Connection\HttpConnectionOAuth.vb" />