我正在开发一个使用 twitter 数字进行身份验证的 iOS 和 django 应用程序。我已经坐了一段时间的文档,不知道我做错了什么。
通信模型是用户注册由 Twitter Digits 提供支持的 iOS 应用程序。这会向用户发送一条带有确认码的文本消息,以验证用户的身份。确认用户身份后,我希望 iOS 应用程序通知服务器,以便服务器可以创建新的用户模型并安全地存储用户的电话号码。
目前,第 8 行来自 Twitter 数字的响应是:
{"errors":[{"code":215,"message":"Bad Authentication data."}]}
我尝试过/做过的事情:
1) 我已经三次、四次检查消费者密钥、消费者秘密和 API 密钥是否与 Fabric 中的应用程序匹配。
2)使用不同的方法,除了OAuthEchoHeadersToVerifyCredentials
包括OAuthEchoHeadersForRequestMethod
和OAuthEchoHeadersToVerifyCredentialsWithParams
3) 使用可以工作的 Web 前端进行调试。这清楚地表明 ios 应用程序发送的身份验证信息是不稳定的。
后端代码如下:
def signup(request):
api_url = request.POST['apiUrl']
auth_headers = request.POST['authHeader']
# security stuff done here
headers = {'Authorization': auth_headers}
response = requests.get(api_url, headers=headers) # Line 8
data = json.loads(response.content)
user, created = User.objects.get_or_create(
phone_number=data['phone_number'],
digits_id=data['id'],
first_name=request.POST['firstName'],
last_name=request.POST['lastName']
)
return JsonResponse({'success': True, 'created': created})
前端代码如下:
@IBAction func goToNextView() {
let firstName = "Joe"
let lastName = "Schmoe"
let digits = Digits.sharedInstance()
digits.authenticateWithCompletion { (session, error) in
if (session != nil) {
let digits = Digits.sharedInstance()
let oauthSigning = DGTOAuthSigning(authConfig: digits.authConfig, authSession: session)
let authHeaders = oauthSigning.OAuthEchoHeadersToVerifyCredentials()
let apiUrl = authHeaders[TWTROAuthEchoRequestURLStringKey]
let authHeader = authHeaders[TWTROAuthEchoAuthorizationHeaderKey]
let url = NSURL(string: "http://localhost:8000/signup")
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"
let bodyData = "apiUrl=\(apiUrl!)&authHeader=\(authHeader!)&firstName=\(firstName)&lastName=\(lastName)"
request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding)
self.defaultSession.dataTaskWithRequest(request, completionHandler: { (data, response, error) in
print("todo")
}).resume()
}
}
}
作为参考,Web前端如下:
Digits.logIn()
.done(onLogin)
function onLogin(loginResponse){
// Send headers to your server and validate user by calling Digits’ API
var oAuthHeaders = loginResponse.oauth_echo_headers;
var verifyData = {
authHeader: oAuthHeaders['X-Verify-Credentials-Authorization'],
apiUrl: oAuthHeaders['X-Auth-Service-Provider'],
firstName: $('#firstName').val(),
lastName: $('#lastName').val()
};
$.post('/signup', verifyData)
.done(function(response){ alert(response); });
}
在这两个前端中,不同的 auth 标头是: - oauth_nonce、oauth_signature,显然还有 oauth_timestamp
但是,两者共享: - Oauth_consumer_key、oauth_token、版本和签名方法
如果有人以前遇到过类似的事情,请告诉我。非常感谢!