2013-03-07 80 views
1

我正在嘗試使用dotnet-client在Google+中編寫活動。問題是,我似乎無法正確地獲得我的客戶端應用程序的配置。根據Google+ Sign-In configurationthis SO question,我們需要添加requestvisibleactions參數。我做到了,但沒有奏效。我正在使用範圍https://www.googleapis.com/auth/plus.login,我甚至添加了範圍https://www.googleapis.com/auth/plus.moments.write,但插入仍然無效。Google+插入時刻使用google-api-dotnet-client

這是我的請求的URL是什麼樣子:

https://accounts.google.com/ServiceLogin?service=lso&passive=1209600&continue=https://accounts.google.com/o/oauth2/auth?scope%3Dhttps://www.googleapis.com/auth/plus.login%2Bhttps://www.googleapis.com/auth/plus.moments.write%26response_type%3Dcode%26redirect_uri%3Dhttp://localhost/%26state%3D%26requestvisibleactions%3Dhttp://schemas.google.com/AddActivity%26client_id%3D000.apps.googleusercontent.com%26request_visible_actions%3Dhttp://schemas.google.com/AddActivity%26hl%3Den%26from_login%3D1%26as%3D-1fbe06f1c6120f4d&ltmpl=popup&shdf=Cm4LEhF0aGlyZFBhcnR5TG9nb1VybBoADAsSFXRoaXJkUGFydHlEaXNwbGF5TmFtZRoHQ2hpa3V0bwwLEgZkb21haW4aB0NoaWt1dG8MCxIVdGhpcmRQYXJ0eURpc3BsYXlUeXBlGgdERUZBVUxUDBIDbHNvIhTeWybcoJ9pXSeN2t-k8A4SUbfhsygBMhQivAmfNSs_LkjXXZ7bPxilXgjMsQ&scc=1

你可以從這裏看到,有一個request_visible_actions,我甚至增加了一個有沒有底線的情況下,我得到的參數錯誤( requestvisibleactions)。

讓我說,我的應用程序正在通過API成功驗證。我可以在通過身份驗證後獲取用戶的個人資料,並且它位於我的應用失敗的「插入時刻」部分。我的插入代碼:

 var body = new Moment(); 
     var target = new ItemScope(); 
     target.Id = referenceId; 
     target.Image = image; 
     target.Type = "http://schemas.google.com/AddActivity"; 
     target.Description = description; 
     target.Name = caption; 

     body.Target = target; 
     body.Type = "http://schemas.google.com/AddActivity"; 

     var insert = 
      new MomentsResource.InsertRequest(
       // this is a valid service instance as I am using this to query the user's profile 
       _plusService, 
       body, 
       id, 
       MomentsResource.Collection.Vault); 

     Moment result = null; 
     try 
     { 
      result = insert.Fetch(); 
     } 
     catch (ThreadAbortException) 
     { 
      // User was not yet authenticated and is being forwarded to the authorization page. 
      throw; 
     } 
     catch (Google.GoogleApiRequestException requestEx) 
     {     
      // here I get a 401 Unauthorized error 

     } 
     catch (Exception ex) 
     { 

     }   ` 
+1

您是否使用了頁面上的Google+登錄按鈕?如果是這樣,你可以將該標記粘貼到你的文章中?或者您是否使用原生OAuth來觸發您顯示的網址?我相信,從URL的形成方式來看,您並未使用該按鈕來觸發身份驗證,是否有原因? – BrettJ 2013-03-07 15:25:45

+0

我正在使用dotnet客戶端。我展示的URL是由API構建的。我知道dotnet客戶端使用DotNetOpenAuth(DNOA),所以我認爲這是建立URL的DNOA。身份驗證通過'Google.Apis.Authentication.OAuth2.OAuth2Authenticator'完成。 – 2013-03-08 04:22:44

+0

哦,對不起,我錯過了回答你的一個問題。我使用我自己的鏈接/按鈕,在那裏我調用一個啓動身份驗證的方法。我的驗證碼基於樣本。如果需要,我也可以發佈它。 – 2013-03-08 04:39:59

回答

1

啊就這麼簡單!也許不會?我正在回答我自己的問題,並因此接受它作爲答案(在幾天之後),以便引導具有相同問題的其他人。但是我肯定會爲Gus的回答投票,因爲這導致我修復了我的代碼。

因此,根據上面所寫的@class回答和explained on his blog,成功創建片刻的關鍵是添加request_visible_actions參數。我這樣做了,但我的請求仍然失敗,這是因爲我錯過了一件重要的事情。您需要添加一個參數,那就是access_type,它應該設置爲offline。 OAuth請求至少應如下所示:https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/plus.login&response_type=code&redirect_uri=http://localhost/& request_visible_actions = http://schemas.google.com/AddActivity&access_type=offline

對於完整和正確的客戶代碼,您可以get Gus' example heredownload the entire dotnet client library including the source and sample並添加我在下面添加的內容。您應該記住的最重要的事情是修改Google API的AuthorizationServerDescription。這裏是我的版本認證的:

public static OAuth2Authenticator<WebServerClient> CreateAuthenticator(
     string clientId, string clientSecret) 
{ 
    if (string.IsNullOrWhiteSpace(clientId)) 
     throw new ArgumentException("clientId cannot be empty"); 

    if (string.IsNullOrWhiteSpace(clientSecret)) 
     throw new ArgumentException("clientSecret cannot be empty"); 

    var description = GoogleAuthenticationServer.Description; 

    var uri = description.AuthorizationEndpoint.AbsoluteUri; 
    // This is the one that has been documented on Gus' blog site 
    // and over at Google's (https://developers.google.com/+/web/signin/) 
    // This is not in the dotnetclient sample by the way 
    // and you need to understand how OAuth and DNOA works. 
    // I had this already, see my original post, 
    // I thought it will make my day. 
    if (uri.IndexOf("request_visible_actions") < 1) 
    { 
     var param = (uri.IndexOf('?') > 0) ? "&" : "?"; 
     description.AuthorizationEndpoint = new Uri(
      uri + param + 
      "request_visible_actions=http://schemas.google.com/AddActivity"); 
    } 

    // This is what I have been missing! 
    // They forgot to tell us about this or did I just miss this somewhere? 
    uri = description.AuthorizationEndpoint.AbsoluteUri; 
    if (uri.IndexOf("offline") < 1) 
    { 
     var param = (uri.IndexOf('?') > 0) ? "&" : "?"; 
     description.AuthorizationEndpoint = 
       new Uri(uri + param + "access_type=offline"); 
    } 

    // Register the authenticator. 
    var provider = new WebServerClient(description) 
    { 
     ClientIdentifier = clientId, 
     ClientSecret = clientSecret,     
    };    
    var authenticator = 
     new OAuth2Authenticator<WebServerClient>(provider, GetAuthorization) 
       { NoCaching = true }; 
    return authenticator; 
} 

沒有access_type=offline我的代碼從未工作而它永遠不會工作。現在我想知道爲什麼?有一些解釋會很好。

2

對於OAuth的流動,有兩個問題你的要求:

  • request_visible_actions是什麼是傳遞到OAuth的V2服務器(不及格requestvisibleactions)
  • plus.moments.write是已棄用的範圍,您只需要傳入plus.login

確保您的項目引用了最新版本的Google+ .NET客戶端庫f ROM這裏:

https://developers.google.com/resources/api-libraries/download/stable/plus/v1/csharp

我已經創建了GitHub上一個項目,在這裏展示一個完整的服務器端流量:

https://github.com/gguuss/gplus_csharp_ssflow

正如Brettj說,你應該使用Google+登錄按鈕的最新Google+樣品中表現出在這裏:

https://github.com/googleplus/gplus-quickstart-csharp

首先,確保您正在請求所有您正在編寫的活動類型。您將知道這是行得通的,因爲授權對話框將顯示「通過Google提供您的應用程序活動,您可以看到並且:[...]」以「此應用程序想要」開頭的文本下方。我知道你檢查了這個,但我90%確定這就是你得到401錯誤代碼的原因。以下標記顯示瞭如何呈現請求訪問「添加」活動的Google+登錄按鈕。

<div id="gConnect"> 
<button class="g-signin" 
    data-scope="https://www.googleapis.com/auth/plus.login" 
    data-requestvisibleactions="http://schemas.google.com/AddActivity" 
    data-clientId="YOUR_CLIENT_ID" 
    data-accesstype="offline" 
    data-callback="onSignInCallback" 
    data-theme="dark" 
    data-cookiepolicy="single_host_origin"> 
</button> 

假設你有一個在數據requestvisibleactions設置正確的活動類型PlusService對象,下面的代碼,你應該能夠複製/粘貼以瞭解其工作,簡明地演示如何使用.NET編寫的時刻客戶端和經過測試的工作:

Moment body = new Moment(); 
ItemScope target = new ItemScope(); 

target.Id = "replacewithuniqueforaddtarget"; 
target.Image = "http://www.google.com/s2/static/images/GoogleyEyes.png"; 
target.Type = ""; 
target.Description = "The description for the activity"; 
target.Name = "An example of add activity"; 

body.Target = target; 
body.Type = "http://schemas.google.com/AddActivity"; 

MomentsResource.InsertRequest insert = 
    new MomentsResource.InsertRequest(
     _plusService, 
     body, 
     "me", 
     MomentsResource.Collection.Vault); 
Moment wrote = insert.Fetch(); 

注意,我包括Google.Apis.Plus.v1.Data爲了方便。

+0

HI @class我通過'requestvisibleactions'傳入希望它可以工作,我想也許arg名稱改變了。我實際上嘗試了兩種方法:(1)使用'requestvisibleactions'和(2)使用'request_visible_actions'並且沒有任何工作。此外,您給我的片段與我所擁有的片段相同,除了:(1)target.Type,其中我嘗試使用「AddActivity」且沒有,兩者都不起作用。 (2)「我」,我的「id」等於「我」。我們有相同的代碼,但它不適合我。它導致我認爲dotnet客戶端上沒有正確包含requestvisibleactions參數的東西缺失? – 2013-03-08 04:31:16

+0

另外,讓我再說一遍,我的代碼用於登錄並獲取用戶的配置文件。所以我確定我的身份驗證只是缺少一個配置,所以我可以創建一個活動。順便說一句,我的第一次嘗試沒有'plus.moments.write'範圍,它沒有工作,這導致我加入它 - 我想也許它會工作。沒有快樂。 – 2013-03-08 04:34:30

+0

@vonv。我將我的項目添加到GitHub,希望這可以幫助您調試。確保你只傳遞request_visible_actions。當您看到用戶界面文字變化表示正在請求應用程序活動時,您會知道您的授權請求是正確的。另外,要仔細檢查這裏,你正在做一個服務器端的流程?導致此問題的最後一件事是,您有一個較舊的庫,並在答案中添加了一個鏈接。 – class 2013-03-08 04:48:59