2

Google+ アカウントを使用してユーザーをサインインさせています。サインインして基本情報を取得し、データベースに保存します。このプロセスでaccess_tokenは、セッションに を保存して先に進みます。

ただし、今日は、 in session を使用して Google+ の「瞬間」に投稿できるスクリプトを作成しようとしていますaccess_token

エラーが発生し、応答は次のようになります。

{ "error": { "errors": [ { "domain": "global", "reason": "authError", "message": "Invalid Credentials", "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Invalid Credentials" } } 

なぜこれが起こっているのかわかりません。以下は、リクエストを行うために使用しているコードです (ColdFusion スクリプトですが、この構文を知らなくても、その背後にある原則を確認できるはずです)。

local.http = new http();
local.http.setMethod("post"); 
local.http.setCharset("utf-8"); 
local.http.setUseragent(cgi.http_user_agent);
local.http.setResolveurl(true);
local.http.setTimeout(20);
local.http.setUrl("https://www.googleapis.com/plus/v1/people/" & session.user.sourceid & "/moments/vault");

local.target = {};
local.target["kind"]        = "plus##moment";
local.target["type"]        = "http://schemas.google.com/AddActivity";
local.target["description"] = params.pin["description"];
local.target["image"]       = session.user.image;
local.target["name"]        = params.pin["title"];
local.target["url"]         = URLfor(route="pinShow", key=obfuscateParam(pin.id), onlyPath=false);
local.target["latitude"]    = session.user.latitude;
local.target["longitude"]   = session.user.longitude;

local.http.addParam(type="formField", name="target", value=serialize(local.target));
local.http.addParam(type="formField", name="kind", value="plus##moment");
local.http.addParam(type="formField", name="type", value="http://schemas.google.com/AddActivity");
local.http.addParam(type="formField", name="access_token", value=session.access_token);
local.result = local.http.send().getPrefix();

ご覧のとおり、すべてが簡単に見えます。

サインイン直後にこれをテストしましたが、それにもかかわらず、ヘッダー応答でトークンが無効であると表示されます。

HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="https://www.google.com/accounts/AuthSubRequest", error=invalid_token Content-Type: application/json; charset=UTF-8 Content-Encoding: gzip Date: Wed, 11 Sep 2013 13:12:28 GMT Expires: Wed, 11 Sep 2013 13:12:28 GMT Cache-Control: private, max-age=0 X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block Content-Length: 162 Server: GSE Alternate-Protocol: 443:quic 

なぜこれが起こっているのか、それを解決する方法を知っている人はいますか?

ColdFusion 用のライブラリがないため、どの種類のライブラリも使用していません。さらに、私のニーズは非常に基本的なものであり、すべてがどのように機能するかを確認したかったため、そうしたくありませんでした。

ここで明らかな何かが欠けていますか?

それは私を夢中にさせているので、どんな助けも大歓迎です!

ありがとう、マイキー。

PS - アカウントからアプリを削除し、すべての Cookie とセッションを消去してから、すべての権限を付与して再度サインインしたため、その側が削除されたようです。

更新 1:

ここで他のユーザーからいくつかの光が輝いた後、リクエストを行うには、JSON レスポンスを HTTP 本文に投稿する必要があることがわかりました。そこで、コードを次のように変更しました。

local.request = {}
local.request["kind"]       = "plus##moment";
local.request["type"]       = "http://schemas.google.com/AddActivity";
local.request["target"]     = {};
local.request.target["kind"]        = "plus##itemScope";
local.request.target["type"]        = "http://schemas.google.com/AddActivity";
local.request.target["description"] = params.pin["description"];
local.request.target["image"]       = session.user.image;
local.request.target["name"]        = params.pin["title"];
local.request.target["url"]         = URLfor(route="pinShow", key=obfuscateParam(pin.id), onlyPath=false);
local.request.target["latitude"]    = session.user.latitude;
local.request.target["longitude"]   = session.user.longitude;

local.http = new http();
local.http.setMethod("post"); 
local.http.setCharset("utf-8"); 
local.http.setUseragent(cgi.http_user_agent);
local.http.setResolveurl(true);
local.http.setTimeout(20);
local.http.setUrl("https://www.googleapis.com/plus/v1/people/" & session.user.sourceid & "/moments/vault?debug=true&fields=kind%2Ctype%2Cdescription%2Cimage%2Curl&key={GOOLE_API_KEY}" );
local.http.addParam(type="header", name="Content-Type", value="application/json");
local.http.addParam(type="header", name="Authorization", value="Authorization: Bearer " & session.access_token);
local.http.addParam(type="body", value=serializeJSON(local.request));

local.result = local.http.send().getPrefix();

ただし、別のエラー (401 無許可) が表示されるようになりました。

{ "error": { "errors": [ { "domain": "global", "reason": "required", "message": "Login Required", "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Login Required" } } 

access_token上記の新しいメソッドを使用して渡す方法を知っている人はいますか?

更新 2

これは、私の元の OAuth 2 プロセスに起因する可能性があることが強調されています。Google+ アカウントからアプリを削除し、確認/サインイン プロセスを再度開始しました。生成された URL は次のとおりです。

https://accounts.google.com/ServiceLogin?service=lso&passive=1209600&continue=https://accounts.google.com/o/oauth2/auth?response_type%3Dcode%26scope%3Dhttps://www.googleapis.com/ auth/userinfo.email%2Bhttps://www.googleapis.com/auth/userinfo.profile%2Bhttps://www.googleapis.com/auth/plus.login%26redirect_uri%3Dhttp:// {MY_DOMAIN}.com/ oauth/google/?do%253Dredirect%26state%3D2BFFBC14-29F9-4488-ABBF661C0E9E53DB%26client_id%3D{MY_CLIENT_ID}%26hl%3Den-GB%26from_login%3D1%26as%3D-593afcc82466f5f<mpl=popup&shdf=CnALEhF0aGlyZFBhcnR5TG9nb1VybBoADAsSFXRoaXJkUGFydHlEaXNwbGF5TmFtZRoIVW5pYmFuZHMMCxIGZG9tYWluGghVbmliYW5kcwwLEhV0aGlyZFBhcnR5RGlzcGxheVR5cGUaB0RFRkFVTFQMEgNsc28iFOyetn24YRlbdWKLAKGXFCH5C1p9KAEyFPquOHBH18K6iV1GTAg_P9zB2x60&sarp=1&scc=1

ここで何か不足していますか?AddActivity ストリームに投稿できるスコープが不足していますか?

更新 3

私の OAuth ログイン URL (読みやすくするために新しい行に分割しようとしました):

https://accounts.google.com/o/oauth2/auth ? scope= https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+ https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+ https%3A%2F%2Fwww.googleapis.com%2Fauth% 2Fplus.login& request_visible_actions= https%3A%2F%2Fschemas.google.com%2FAddActivity& state= 65B4A4D1-0C49-4C65-9B46163E67D88EAD& redirect_uri= http%3A%2F%2FXXXXXXX.com%2Foauth%2Fgoogle%2F%3Fdo%3Dredirect& response_type= code& client_id= XXXXXXXX.apps.googleusercontent.com

Google+ の権限画面には、次のように表示されます。

ここに画像の説明を入力

今 addActivity を投稿しようとすると、以前と同じように不正なリクエスト エラーが発生します。

JSON が返すエラー:

{ "error": { "errors": [ { "domain": "global", "reason": "invalid", "message": "Invalid Value" } ], "code": 400, "message": "Invalid Value" } }

返されたヘッダー:

HTTP/1.1 400 Bad Request Content-Type: application/json; charset=UTF-8 Content-Encoding: gzip Date: Fri, 13 Sep 2013 11:38:20 GMT Expires: Fri, 13 Sep 2013 11:38:20 GMT Cache-Control: private, max-age=0 X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block Content-Length: 123 Server: GSE Alternate-Protocol: 443:quic 
4

4 に答える 4

1

私は ColdFusion に完全に精通しているわけではありませんが、ここでは混合できない 2 つの概念を混合しているように見えます。access_token は通常、HTTP ヘッダーで指定するか、URL クエリ パラメータとして指定します。これは通常、POST パラメータとして設定されておらず、それが問題の一部である可能性があります。

ヘッダーで行う場合、HTTP ヘッダーは

Authorization: Bearer 1/fFBGRNJru1FQd44AzqT3Zg

URL クエリ パラメータを使用すると、URL は次のようになります。

https://www.googleapis.com/plus/v1/people/123456789012345/moments/vault?access_token=1/fFBGRNJru1FQd44AzqT3Zg

詳細については、 https://developers.google.com/accounts/docs/OAuth2UserAgent#callinganapiを参照してください

これが関連しているかどうかはわかりませんが、そうかもしれませんが、POST の本文が正しいかどうかもわかりません。本文に content-type を設定していません。CF が「application/www-form-url-encoded」や「multipart/form-data」などを使用するかどうかはわかりませんが、どちらも有効ではありません. 本文は「application/json」にする必要があります。

アップデート

したがって、変更されたコードを考えると、おそらく setUrl 行を次のようにする必要があります

local.http.setUrl("https://www.googleapis.com/plus/v1/people/" & session.user.sourceid & "/moments/vault?access_token=" & session.access_token );

上で提供した URL は、Google での OAuth2 の決定的なドキュメントを提供します。URL に追加しようとした他のパラメーターやその理由はわかりませんが、それらが不可欠な場合は、この方法でアクセス トークンの後に追加できます。

于 2013-09-11T14:21:39.200 に答える
1

アップデート2に対応して編集

これは、OAuth フローの設定に問題があるように思えます。OAuth で生成された URL に基づいて、request_visible_actionsパラメータが欠落しているか、形式が正しくありません。

次のクエリ パラメータを OAuth URL に追加すると、これが機能し始めるはずです。

&request_visible_actions=http%3A%2F%2Fschemas.google.com%2FAddActivity

リクエストのもう 1 つの問題は、リクエストuserinfo.profileからスコープを削除する必要があることです。含まれているため、そのスコープは必要ありませんplus.login。奇妙な問題が発生する可能性があります。

最後に、ターゲット URL のページに、 AddActivity モーメント タイプに必要な最小限のレベルの schema.org メタデータがあることを確認します。これは今の問題ではありませんが、次に遭遇する問題になる可能性があります。

于 2013-09-12T02:34:57.960 に答える