質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java EE

    376questions

    Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

  • OAuth 2.0

    87questions

    OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

OAuth認証 FacebookのURLエラー

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 650

yuiti926

score 18

現在練習用サイトをオープンサーバーに上げてOAuth認証を試しているんですが、Twitter,Google+でのリダイレクトは確認出来たのですがFacebookだけ画像のようなエラーが出てしまいます
https://gyazo.com/977dbfff189828f6d84cb854358a2eb2
OKを押すと↓が出る
https://gyazo.com/3e19cf7273f6c64f76bb77232cf09d64

ソースコードと見比べながらfbのURI設定等を確認したのですがどこを直せばいいのか全く分かりません!
下記に自分のfacebookoathのコードを載せるので、エラーの原因と直し方を教えてください!

コード
package com.internousdev.uesto.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.simple.JSONValue;

import com.opensymphony.xwork2.ActionSupport;

import facebook4j.Facebook;
import facebook4j.FacebookFactory;
import facebook4j.auth.AccessToken;
 /**
 * FacebookOAuthでトークンを取得する為のクラス
 * @author 
 * @since 2016/04/06
 * @version 1.0
 */
public class FacebookOauth extends ActionSupport {

    /**
     * 生成されたシリアルナンバー
     */
    private static final long serialVersionUID = -4010623960566292617L;

    /**
     * APP ID
     */
    private static final String APP_ID = "1708904312731410";

    /**
     * レスポンスURL
     */
    private static final String APP_SECRET = "f1c899d652d8b0bfd4f5cd5967d11134";

    /**
     * コールバックパス
     */
    private static final String CALLBACK_PATH = "/login-facebook-action";

    /**
     * リクエストトークンを取得する為のメソッド
     * @param request リクエスト
     * @param response レスポンス
     * @return true/false <p>リクエストトークンが取得できた場合はtrueをそうでない場合はfalseを返します。</p>
     */
    public boolean getRequestToken(HttpServletRequest request, HttpServletResponse response) {
        Facebook facebook = new FacebookFactory().getInstance();
        request.getSession().setAttribute("facebook", facebook);
        facebook.setOAuthAppId(APP_ID, APP_SECRET);
        String accessTokenString = APP_ID + "|" + APP_SECRET;
        AccessToken at = new AccessToken(accessTokenString);
        facebook.setOAuthAccessToken(at);
        StringBuffer callbackURL = request.getRequestURL();
        int index = callbackURL.lastIndexOf("/");
        callbackURL.replace(index, callbackURL.length(), "").append(CALLBACK_PATH);
        try {
            response.sendRedirect(facebook.getOAuthAuthorizationURL(callbackURL.toString()));
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * アクセストークンを取得する為のメソッド
     * @param request リクエスト
     * @param response レスポスト
     * @return userMap ユーザー情報
     * @return userMap <p>ユーザー情報の値をuserMapに返します。</p>
     */
    public Map<String, String> getAccessToken(HttpServletRequest request, HttpServletResponse response){
        final String callbackURL = request.getRequestURL().toString();
        final String code = request.getParameter("code");
        if(code == null){
            try {
                response.sendRedirect(request.getContextPath()+ "/login");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String accessTokenURL = null;
        try {
            accessTokenURL = "https://graph.facebook.com/oauth/access_token?client_id="
                    + APP_ID //結合
                    + "&redirect_uri="
                    + URLEncoder.encode(callbackURL, "UTF-8")
                    + "&client_secret="
                    + APP_SECRET + "&code=" + URLEncoder.encode(code, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String accessTokenResult = null;
        try {
            accessTokenResult = httpRequest(new URL(accessTokenURL));
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }

        String accessToken = null;
        String[] pairs = accessTokenResult.split("&");
        for (String pair : pairs) {
            String[] kv = pair.split("=");
            if (kv.length != 2) {
                throw new RuntimeException("Unexpected auth response");
            } else {
                if (kv[0].equals("access_token")) {
                    accessToken = kv[1];
                }
            }
        }
        String apiURL = null;
        try {
            apiURL = "https://graph.facebook.com/me?access_token="
                    + URLEncoder.encode(accessToken, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String apiResult = null;
        try {
            apiResult = httpRequest(new URL(apiURL));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        @SuppressWarnings("unchecked")
        Map<String, String> userMap = (Map<String, String>) JSONValue.parse(apiResult);
        return userMap;
    }

    /**
     * APIURL(apiURL)を読み込む為のメソッド
     * @param url URL
     * @return response <p>読み込んだURLの値をresponseに返します。</p>
     */
    private String httpRequest(URL url) {
        HttpURLConnection conn = null;
        String response = "";
        try {
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("GET");
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    conn.getInputStream()));
            String line = null;

            while ((line = reader.readLine()) != null) {
                response += line;
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            conn.disconnect();
        }
        return response;
    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java EE

    376questions

    Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

  • OAuth 2.0

    87questions

    OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。