2017-05-01 6 views
0

authトークンをエンコードしてREST APIに渡そうとしていますが、これはpowershellでうまく動作しますが、Pythonスクリプトに同じメソッドを適用すると「許可されていない」例外がスローされます。Base64エンコーディングの問題 - Python vs Powershell

エンコードされた値に問題があると思われます。解決策を見つけることができません。何か案は ?

残りのエンドポイントはIBM uDeployです。

PowerShellの

$tokenEncoded = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("PasswordIsAuthToken:{`"token`":`"$pass`"}")) 
$basicAuthValue = "Basic $tokenEncoded" 
$headers = @{} 
$headers.Add("Authorization", $basicAuthValue) 
$response = Invoke-RestMethod -Method Put -Headers $headers -Uri $requestUri -Body $jsonRequest 

Pythonの

epass = base64.b64encode("PasswordIsAuthToken:{\"token\":\"$password\"}") 
print 'base64 encoded: ' + epass 
opener = urllib2.build_opener(urllib2.HTTPHandler) 
req = urllib2.Request(reqUrl,json.dumps(json_data)) 
req.add_header('Authorization', 'Basic '+epass) 
req.get_method = lambda: 'PUT' 
resp = opener.open(req) 

答えて

2

あなたはトークンとして文字列リテラル$password、ないpasswordという名前の変数の内容を送信しています。

あなただけPasswordIsAuthTokenと基本認証HTTPヘッダー内のトークン(PasswordIsAuthTokenフォームのユーザー名、およびtokenパスワード)を含める必要があります。

epass = base64.b64encode("PasswordIsAuthToken:" + password) 
opener = urllib2.build_opener(urllib2.HTTPHandler) 
req = urllib2.Request(reqUrl,json.dumps(json_data)) 
req.add_header('Authorization', 'Basic ' + epass) 

あなたはreall場合はJSONにトークンをラップする必要があります様構造は、その後、あなたは文字列フォーマットを使用する必要があるだろう(PowerShellのコードもありませんが、あなたは省略):

epass = base64.b64encode('PasswordIsAuthToken:{"token":"%s"}' % password) 

か、jsonモジュール使用できます

epass = base64.b64encode('PasswordIsAuthToken:' + json.dumps({'token': password})) 

しかし、私はシステムがアンラップされたトークンを受け入れるべきだと考えています。

私は強く、非常にクリーンなREST APIを使用して作るこれ、あなたの代わりにrequests libraryを使用することをお勧め:

import requests 

auth = ('PasswordIsAuthToken', password) 
# or alternatively 
# auth = ('PasswordIsAuthToken', '{"token":"%s"}' % password) 
response = requests.put(json=json_data, auth=auth) 

注意がJSONの体を自分でエンコードする必要がなく、また、あなたが基本をエンコードする必要がないということAuthヘッダー。

関連する問題