2013-10-24 3 views
0

Я могу получить доступ, получив токен аутентификации из браузера и используя «Fetch ...» позже. Но я хочу сделать это без вмешательства пользователя. Я решил использовать служебную учетную запись. Но когда я пытаюсь получить доступ, Я всегда получаю «доступ запрещен». Я используюДоступ запрещен при попытке аутентификации через oauth

var oAuth2Provider = 
       (user.OAuthProvider as AdsOAuthProviderForServiceAccounts); 
     oAuth2Provider.GenerateAccessTokenForServiceAccount(); 

Свойства oAuth2Provider являются:

JwtCertificatePassword "notasecret"
JwtCertificatePath "D: //xxxxx-privatekey.p12"
PrnEmail «jrusearchbroadtwomycc @ gmail.com. com "// это моя учетная запись mcc с одобренный токен разработчика
ServiceAccountEmail" [email protected]ccount.com "

Здесь показаны ошибки стека.

at Google.Api.Ads.Common.Lib.OAuth2ProviderForServiceAccounts.GenerateAccessTokenForServiceAccount() 
    at AdwordsStat.GetReports.DoAuth2Authorization(AdsUser user) in D:\Adwords_API\Jooble_Adwords\GetReports.cs:line 48 
    at AdwordsStat.Form1.Form1_Shown(Object sender, EventArgs e) in D:\Adwords_API\Jooble_Adwords\Form1.cs:line 87 
    at System.Windows.Forms.Form.OnShown(EventArgs e) 
    at System.Windows.Forms.Form.CallShownEvent() 
    at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme) 
    at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj) 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme) 
    at System.Windows.Forms.Control.InvokeMarshaledCallbacks() 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
    at System.Windows.Forms.Form.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.Run(Form mainForm) 
    at AdwordsStat.Program.Main() in D:\Adwords_API\Jooble_Adwords\Program.cs:line 16 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

Затем я прочитал о необходимости учетной записи Google Apps. Я зарегистрировался, добавил к нему аккаунт в аккаунт cliend идентификатор из моей учетной записи службы, которая выглядит как

2222222222222-ckvf630rcccn3j7jjuf4fmujnbiotett.apps.googleusercontent.com область применения: https://adwords.google.com/api/adwords/

Но я получаю доступ снова отказано ,

Тогда я пытался использовать другую библиотеку, которая выглядит как `

public static Dictionary<string, string> GetAccessToken(string clientIdEMail, string keyFilePath, string scope) 
     { 
      // certificate 
      var certificate = new X509Certificate2(keyFilePath, "notasecret"); 

     // header 
     var header = new { typ = "JWT", alg = "RS256" }; 

     // claimset 
     var times = GetExpiryAndIssueDate(); 
     var claimset = new 
     { 
      iss = clientIdEMail, 
      scope = scope, 
      aud = "https://accounts.google.com/o/oauth2/token", 
      iat = times[0], 
      exp = times[1], 
     }; 

     JavaScriptSerializer ser = new JavaScriptSerializer(); 

     // encoded header 
     var headerSerialized = ser.Serialize(header); 
     var headerBytes = Encoding.UTF8.GetBytes(headerSerialized); 
     var headerEncoded = Convert.ToBase64String(headerBytes); 

     // encoded claimset 
     var claimsetSerialized = ser.Serialize(claimset); 
     var claimsetBytes = Encoding.UTF8.GetBytes(claimsetSerialized); 
     var claimsetEncoded = Convert.ToBase64String(claimsetBytes); 

     // input 
     var input = headerEncoded + "." + claimsetEncoded; 
     var inputBytes = Encoding.UTF8.GetBytes(input); 

     // signiture 
     var rsa = certificate.PrivateKey as RSACryptoServiceProvider; 
     var cspParam = new CspParameters 
     { 
      KeyContainerName = rsa.CspKeyContainerInfo.KeyContainerName, 
      KeyNumber = rsa.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2 
     }; 
     var aescsp = new RSACryptoServiceProvider(cspParam) { PersistKeyInCsp = false }; 
     var signatureBytes = aescsp.SignData(inputBytes, "SHA256"); 
     var signatureEncoded = Convert.ToBase64String(signatureBytes); 

     // jwt 
     var jwt = headerEncoded + "." + claimsetEncoded + "." + signatureEncoded; 

     var client = new WebClient(); 
     client.Encoding = Encoding.UTF8; 
     var uri = "https://accounts.google.com/o/oauth2/token"; 
     var content = new NameValueCollection(); 

     content["assertion"] = jwt; 
     content["grant_type"] = "urn:ietf:params:oauth:grant-type:jwt-bearer"; 

     string response = Encoding.UTF8.GetString(client.UploadValues(uri, "POST", content)); 

     var result = ser.Deserialize<Dictionary<string, string>>(response); 

     return result; 
    } 

    private static int[] GetExpiryAndIssueDate() 
    { 
     var utc0 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
     var issueTime = DateTime.UtcNow; 

     var iat = (int)issueTime.Subtract(utc0).TotalSeconds; 
     var exp = (int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds; 

     return new[] { iat, exp }; 
    }` 

И после этого-i've получения маркера доступа и время истечения.

var result = GetAccessToken(SERVICE_ACCOUNT_EMAIL, SERVICE_ACCOUNT_PKCS12_FILE_PATH, SCOPE_ANALYTICS_READONLY); 
      string access_token; 
      result.TryGetValue("access_token", out access_token); 

я пытаюсь

oAuth2Provider.AccessToken = access_token; 

Но снова получать доступ запрещен

Я пытался решить эту проблему в течение недели.

+0

Может кто-нибудь помочь мне с моей проблемой ??? – Aidanpraid

+0

Вы нашли решение? – Hnatt

+0

Я решил. Я использую аккаунт Google Apps для получения доступа к api сейчас. И я зарегистрировал эту учетную запись в качестве моего центра клиентов. – Aidanpraid

ответ

0

Это не на 100% очевидное, что вы действительно пытаетесь выполнить, но если вам нужно иметь автономный доступ от имени пользователя, то, возможно, вам нужен «токен обновления», чтобы вы могли получить новый доступ токен, когда истечет ваш первоначальный срок действия. Информация находится на https://developers.google.com/accounts/docs/OAuth2WebServer

+0

Я пытаюсь получить доступ без вмешательства пользователя. Он будет запускаться на нашем сервере каждую ночь. Так что у меня не было бы доступа и шанса получить маркер доступа вручную – Aidanpraid

Смежные вопросы