Google Oauth مع Indy في Delphi
سؤال
أنا أستخدم Indy10 مع Delphi وأحاول الحصول عليها Google's Oauth للعمل. الخطوة الأولى هي تقديم طلب إلى طريقة OauthgetRequestToken. الكود أدناه يعيد خطأ 400. أي مساعدة سيكون موضع تقدير كبير.
procedure TForm1.Button1Click(Sender: TObject);
var
IdHTTP: TIdHTTP;
IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocketOpenSSL;
Params: TStringList;
mString: String;
begin
Params := tstringlist.create;
IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil);
IdHTTP := TIdHTTP.create(nil);
with IdSSLIOHandlerSocket1 do begin
SSLOptions.Method := sslvSSLv3;
SSLOptions.Mode := sslmUnassigned;
SSLOptions.VerifyMode := [];
SSLOptions.VerifyDepth := 2;
end;
with IdHTTP do begin
IOHandler := IdSSLIOHandlerSocket1;
ReadTimeout := 0;
AllowCookies := True;
ProxyParams.BasicAuthentication := False;
ProxyParams.ProxyPort := 0;
Request.ContentLength := -1;
Request.ContentRangeEnd := 0;
Request.ContentRangeStart := 0;
Request.ContentType := 'application/x-www-form-urlencoded';
request.host := 'https://www.google.com';
Request.Accept := 'text/html, */*';
Request.BasicAuthentication := False;
Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
HTTPOptions := [hoForceEncodeParams];
end;
Params.Add('scope=https://www.google.com/analytics/feeds/');
Params.Add('oauth_consumer_key=anonymous');
Params.Add('oauth_signature_method=HMAC-SHA1');
Params.Add('oauth_signature=wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D');
Params.Add('oauth_timestamp=137131200');
Params.Add('oauth_nonce=4572616e48616d6d65724c61686176');
showmessage(HTTPDecode(IdHTTP.Post('https://www.google.com/accounts/OAuthGetRequestToken',Params)));
end;
المحلول
انظر إلى بيانات الاستجابة (حيث يتم رفع الاستثناء) ، وسيعطيك سببًا أكثر تفصيلًا للمشكلة.
على سبيل المثال ، في محاولة مع الكود الخاص بك ، حصلت أولاً على "Timestamp بعيدًا جدًا عن الوقت الحالي" ، ثم بعد تحديث OAUTH_TIMESTAMP ، حصلت على "توقيع غير صالح" ...
نصائح أخرى
تحقق مما إذا كنت قد حصلت على رسالة إرجاع في رأس الاستجابة, ، أيضًا ، إلى جانب 400. توفر معظم خدمات الويب نوعًا من الوصف النصي حول الخطأ الذي يحدث.
تحقق أيضًا من أن مكتبة OpenSSL قد تم تحميلها بالفعل ، وإلا فإن Indy قد تتوقف عن الاتصالات غير المشفرة ، والتي قد لا يقبلها الخادم.
حاول توجيه طلبك من خلال HTTP Fiddler.
لقد وجدت أن أداة ممتازة لتتبع ما يحدث على مستوى HTTP/HTTPS.
-جيرون