OAuth認証 FacebookのURLエラー
受付中
回答 0
投稿
- 評価
- クリップ 1
- VIEW 1,238
現在練習用サイトをオープンサーバーに上げて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で質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる