2013-03-14 78 views
0

我正在嘗試編寫一個在Google日曆中創建條目的工具。 在跟隨谷歌文檔並在api控制檯中創建客戶端標識符/密碼後,我設法將一個客戶端正確認證並顯示我註冊的Google日曆。現在對我來說,看起來我的谷歌帳戶與我的客戶端標識符/祕密有某種聯繫。我想知道的是:我如何更改auth過程,以便該工具的其他用戶可以輸入他的google-id並訪問他的日曆?使用不同的用戶/資源所有者登錄

編輯:換句話說(在RFC中使用):我想讓資源所有者部分可編輯,同時保持客戶部分不變。但我的例子雖然有效,但將客戶和資源所有者聯繫在一起。

這裏是我的應用程序工作正常至今:

public void Connect() 
    { 
     var provider = new NativeApplicationClient(GoogleAuthenticationServer.Description); 
     provider.ClientIdentifier = "123456123456.apps.googleusercontent.com"; 
     provider.ClientSecret = "nASdjKlhnaxEkasDhhdfLklr"; 
     var auth = new OAuth2Authenticator<NativeApplicationClient>(provider, GetAuthorization); 
     var service = new CalendarService(auth); 

     //Events instances = service.Events.Instances("primary", "recurringEventId").Fetch(); 
     var list = service.CalendarList.List().Fetch(); 

     foreach (var itm in list.Items) 
      Console.WriteLine(itm.Summary); 
    } 

    private static readonly byte[] AditionalEntropy = { 1, 2, 3, 4, 5 }; 

    private static IAuthorizationState GetAuthorization(NativeApplicationClient arg) 
    { 
     var state = new AuthorizationState(new[] { CalendarService.Scopes.Calendar.GetStringValue() }); 
     state.Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl); 

     var refreshToken = LoadRefreshToken(); 
     if (!String.IsNullOrWhiteSpace(refreshToken)) 
     { 
      state.RefreshToken = refreshToken; 

      if (arg.RefreshToken(state)) 
       return state; 
     } 

     var authUri = arg.RequestUserAuthorization(state); 

     // Request authorization from the user (by opening a browser window): 
     Process.Start(authUri.ToString()); 
     var frm = new FormAuthCodeInput(); 
     frm.ShowDialog(); 

     // Retrieve the access token by using the authorization code: 
     var auth = arg.ProcessUserAuthorization(frm.txtAuthCode.Text, state); 
     StoreRefreshToken(state); 
     return auth; 
    } 

    private static string LoadRefreshToken() 
    { 
     try 
     { 
      return Encoding.Unicode.GetString(ProtectedData.Unprotect(Convert.FromBase64String(Properties.Settings.Default.RefreshToken), AditionalEntropy, DataProtectionScope.CurrentUser)); 
     } 
     catch 
     { 
      return null; 
     } 
    } 

    private static void StoreRefreshToken(IAuthorizationState state) 
    { 
     Properties.Settings.Default.RefreshToken = Convert.ToBase64String(ProtectedData.Protect(Encoding.Unicode.GetBytes(state.RefreshToken), AditionalEntropy, DataProtectionScope.CurrentUser)); 
     Properties.Settings.Default.Save(); 
    } 
+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-03-14 23:42:06

回答

0

我自己解決了這個問題。

問題是,我通常總是連接到谷歌,因爲我沒有註銷谷歌,然後我的應用程序重定向到谷歌獲取訪問令牌,谷​​歌自動生成我的帳戶的訪問令牌 - 跳過輸入表單出現的地方,任何人都可以輸入他/她的用戶憑據,讓谷歌爲他/她的賬戶生成訪問令牌。

0

提示用戶輸入他們的ClientIdentifier和ClientSecret,然後這些值傳遞到您的連接方法。

+0

我不想更改客戶端標識符和-secret,這些值標識我的程序。我想讓其他用戶(資源所有者)使用我的程序(客戶端)訪問他們的資源在谷歌(資源服務器) – gofrm 2013-03-15 08:35:00

相關問題