0

SpringMVCコントローラーを備えたSpringWebアプリがあります。Facebookアプリに接続して、さらにアクセスするために使用される認証トークンを取得することになっています。私たちのアプリとの通信は機能しているようです。リンクを押したとき

<a href="https://www.facebook.com/dialog/oauth?client_id=something&redirect_uri=http://our.domaine.register/postback?user_id=12345&scope=manage_pages&response_type=code">connect</a>

Facebookにリダイレクトされます。クレデンシャルを入力して、にリダイレクトされます。

our.domaine.register/postback?user_id=12345&code=SoMEcOde

これもSpringMVCコントローラーの1つですが、それは実際には問題ではありません。

問題は、Facebookから返されるコードが不正な形式のaccessTokenであるということです。

つまり、保護されたリソースにアクセスするためにそれを使用しようとすると、機能しません。同じ呼び出しをグラフAPIエクスプローラーを介して取得したアクセストークンに置き換えると、正常に機能します。

返されるコードは、通常のアクセストークンにはない、「-」、「_」、および「=」の文字を含む固有の形式になっています。

だから私は、何らかの変換を行う必要があると思いますか?!それとも、ある種のフォーマットの問題ですか?

返されたトークン:

AQBoXkcR5zRUiuHoO_lLdQfnxxxxxxxxxxxxxxxxoPPvZQTeybT9ebsI2SD1Xk

コードはaccessTokenと同じですか?

公式ドキュメントでは、ほとんどの場合、アンカーハッシュ(REDIRECT_URL /#access_token = ...)の使用とjavascriptを介したaccess_tokenへのアクセスについて説明していますが、それが自然ではなく、テストできない理由がわかりません...

誰かがコード引数を使用して、コントローラーでアクセスできるように要求パラメーターとしてマップしましたか?

4

2 に答える 2

2

response_typeがコードを要求しているようです。そのため、トークンは返されません。

plzはhttps://developers.facebook.com/docs/authentication/の最後のセクションを確認してください

正しい呼び出しの例。

https://www.facebook.com/dialog/oauth?
    client_id=YOUR_APP_ID
   &redirect_uri=https://www.facebook.com/connect/login_success.html
   &response_type=token

ログインが成功すると、リダイレクトurにはaccess_tokenおよびexpires_inパラメーターが追加されます。URLパラメータをデコードして、必要なものを取得できます。これがAndroidOAuthの例のサンプル関数です(Javaに簡単に適応できます):

public static Bundle decodeUrl(String s) {
        Bundle params = new Bundle();
        if (s != null) {
            String array[] = s.split("&");
            for (String parameter : array) {
                String v[] = parameter.split("=");
                // YG: in case param has no value
                if (v.length==2){
                    params.putString(URLDecoder.decode(v[0]),
                                 URLDecoder.decode(v[1]));
                }
                else {
                    params.putString(URLDecoder.decode(v[0])," ");
                }
            }
        }
        return params;
    }

    /**
     * Parse a URL query and fragment parameters into a key-value bundle.
     * 
     * @param url the URL to parse
     * @return a dictionary bundle of keys and values
     */
    public static Bundle parseUrl(String url) {

        try {
            URL u = new URL(url);
            Bundle b = decodeUrl(u.getQuery());
            b.putAll(decodeUrl(u.getRef()));
            return b;
        } catch (MalformedURLException e) {
            Log.w(TAG, "parseUrl ex ->" + e.toString());
            return new Bundle();
        }
    }
于 2012-07-31T16:40:19.217 に答える
1

彼らがあなたに返すコードはOAuth認証コードであり、アクセストークンはありません。これを別の呼び出しとのアクセストークンと交換する必要があります。サーバー側の認証については、Facebookのドキュメントのポイント4を参照してください

更新:( 申し訳ありませんが、「クライアント側認証」と言う見出しを見逃しました;))

response_type=tokenの代わりに使用するresponse_type=codeと、OAuth認証コードではなく、アクセストークンを直接取得できます。クライアント側認証については、Facebookのドキュメントの「 JSSDKを使用しないクライアント側認証」のセクションを参照してください。

アップデート:

Webアプリケーションを開発しようとしているので、サーバー側の認証フローが正しい使用方法です。これは、認証コード(ユーザーをリダイレクトした後に取得するコード)を別の呼び出しとアクセストークンと交換することを意味します。

ですから、私が今それが正しいと理解しているなら、あなたの問題は、あなたが受け取った応答からアクセストークンをどのように取得するかです。Springを使用してこのようなことを行う方法については、この例を確認してください。あなたの場合、これは認証コードを取得するようなものになります:

@RequestMapping(value = "/postback", params = "code", method = RequestMethod.GET)
@ResponseBody
private void accessCode(@RequestParam("code") String code,
                            HttpServletRequest request,
                            HttpServletResponse response) throws Exception {
        //Now the variable 'code' holds the authorization code
}
于 2012-07-31T16:38:11.577 に答える