web-dev-qa-db-ja.com

Java OAuthを使用してFacebookアカウントでGoogle App Engineにログインする方法の例

私はよく検索し、多くのブログ、記事、チュートリアルを読みましたが、今まではFacebookアカウントを使用してアプリケーションにログインする実例はありませんでした。

OAuthを使用し、トークン、認証などを取得する必要があることを知っています。

誰でも例を共有できますか?

39
LeandroRezende

App Engineでの方法は次のとおりです。

ステップ1)Facebookで「アプリ」を登録します(cf. https://developers.facebook.com/ )。 Facebookにアプリの名前とURLを付けます。登録するURLは、ログインを処理するページ(jspまたはサーブレット)のURLです。登録から、「アプリID」と「アプリシークレット」という2つの文字列を取得します(後者はパスワードです。これを公開したり、htmlで記述したりしないでください)。

この例では、登録するURLが「 http://myappengineappid.appspot.com/signin_fb.do 」であるとします。

2)Webページから、たとえばボタンを使用して、ユーザーをFacebookの次のURLにリダイレクトし、下の例の「myfacebookappid」をアプリIDに置き換えます。また、ユーザーに尋ねる権限(または「スコープ」)を選択する必要があります(cf. https://developers.facebook.com/docs/reference/api/permissions/ )。この例では、ユーザーのメールのみへのアクセスを要求しています。

(知っておくと便利なのは、「state」パラメータで変更せずに返されるオプションの文字列も渡すことができることです。たとえば、ユーザーのデータストアキーを渡すので、Facebookがキーを戻すときにユーザーを取得できます私に。例ではこれをしていません。)

これがjspスニペットです。

<%@page import="Java.net.URLEncoder" %>
<%
    String fbURL = "http://www.facebook.com/dialog/oauth?client_id=myfacebookappid&redirect_uri=" + URLEncoder.encode("http://myappengineappid.appspot.com/signin_fb.do") + "&scope=email";
%>

<a href="<%= fbURL %>"><img src="/img/facebook.png" border="0" /></a>

3)ユーザーはFacebookに転送され、要求した許可の承認を求められます。次に、ユーザーは登録したURLにリダイレクトされます。この例では、これは「 http://myappengineappid.appspot.com/signin_fb.do 」であり、web.xmlでは次のサーブレットにマップされます。

import org.json.JSONObject;
import org.json.JSONException;

import Java.io.BufferedReader;
import Java.io.InputStreamReader;
import Java.io.IOException;

import Java.net.URL;
import Java.net.URLConnection;
import Java.net.URLEncoder;

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

public class SignInFB extends HttpServlet {

    public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {            
        String code = req.getParameter("code");
        if (code == null || code.equals("")) {
            // an error occurred, handle this
        }

        String token = null;
        try {
            String g = "https://graph.facebook.com/oauth/access_token?client_id=myfacebookappid&redirect_uri=" + URLEncoder.encode("http://myappengineappid.appspot.com/signin_fb.do", "UTF-8") + "&client_secret=myfacebookappsecret&code=" + code;
            URL u = new URL(g);
            URLConnection c = u.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
            String inputLine;
            StringBuffer b = new StringBuffer();
            while ((inputLine = in.readLine()) != null)
                b.append(inputLine + "\n");            
            in.close();
            token = b.toString();
            if (token.startsWith("{"))
                throw new Exception("error on requesting token: " + token + " with code: " + code);
        } catch (Exception e) {
                // an error occurred, handle this
        }

        String graph = null;
        try {
            String g = "https://graph.facebook.com/me?" + token;
            URL u = new URL(g);
            URLConnection c = u.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
            String inputLine;
            StringBuffer b = new StringBuffer();
            while ((inputLine = in.readLine()) != null)
                b.append(inputLine + "\n");            
            in.close();
            graph = b.toString();
        } catch (Exception e) {
                // an error occurred, handle this
        }

        String facebookId;
        String firstName;
        String middleNames;
        String lastName;
        String email;
        Gender gender;
        try {
            JSONObject json = new JSONObject(graph);
            facebookId = json.getString("id");
            firstName = json.getString("first_name");
            if (json.has("middle_name"))
               middleNames = json.getString("middle_name");
            else
                middleNames = null;
            if (middleNames != null && middleNames.equals(""))
                middleNames = null;
            lastName = json.getString("last_name");
            email = json.getString("email");
            if (json.has("gender")) {
                String g = json.getString("gender");
                if (g.equalsIgnoreCase("female"))
                    gender = Gender.FEMALE;
                else if (g.equalsIgnoreCase("male"))
                    gender = Gender.MALE;
                else
                    gender = Gender.UNKNOWN;
            } else {
                gender = Gender.UNKNOWN;
            }
        } catch (JSONException e) {
            // an error occurred, handle this
        }

        ...

エラー処理コードを削除しました。私とは異なる方法で処理したいかもしれません。 (もちろん、「性別」は私が定義したクラスです。)この時点で、新しいユーザーの登録やログインする既存のユーザーの検索など、必要なデータを使用できます。 myfacebookappsecret "文字列は、もちろんFacebookのアプリシークレットにする必要があります。

このコードを使用するには、「org.json」パッケージが必要になります。このコードは、 http://json.org/Java/ にあります(.Javaファイルを取得して、 org/jsonフォルダー構造内のコード)。

これがお役に立てば幸いです。不明な点がある場合はコメントしてください。回答を更新します。

元アニモ-アレクサンダー。

****更新****

少し情報を追加したいのですが、これが少し過剰に思える場合はおmyび申し上げます。

Facebookアカウントでユーザーにログインできるようにするには、話しているデータストア内のユーザーを知る必要があります。新しいユーザーの場合は、簡単に新しいユーザーオブジェクトを作成し(「facebookId」というフィールド、またはFacebookから値を取得する名前を付けて)、データストアに保持してユーザーをログインします。

ユーザーが存在する場合は、facebookIdを持つフィールドが必要です。ユーザーがFacebookからリダイレクトされたら、facebookIdを取得し、データストアを調べてログインするユーザーを見つけることができます。

既にユーザーがいる場合は、通常の方法でログインできるようにする必要があります。そのため、ユーザーを確認してからFacebookに送信し、facebookIdを取得してユーザーオブジェクトを更新します。これにより、次回からFacebookを使用してログインできます。

別の小さなメモ:ユーザーには、Facebookの画面が表示され、要求するスコープへのアプリのアクセスを許可するよう求められますが、これを回避する方法はありません(要求するスコープが少ないほど、邪魔にならないように見えます)。ただし、これはユーザーが最初にリダイレクトされるときにのみ発生します(後でさらにスコープを要求しない限り、再度要求します)。

52
yngling

Face4j https://github.com/nischal/face4j/wiki を試すことができます。私たちは製品でそれを使用しました http://grabinbox.com そして誰でも使用できるようにオープンソースにしました。 GAEでうまく機能します。

Wikiには、数分でログインをFacebookと統合するのに役立つ例があります。

face4jは、oAuth 2.0およびfacebook graph APIを使用します。

6
Nischal

OAuth自分に署名することを実装しようとすると、多くの困難がありました。トークンが実際に認証されないという問題をデバッグしようとして、多くの時間を費やしました。どのソリューションも私のために機能しなかったので、 Scribe 、a nifty Java =OAuth追加の利点を持つライブラリFacebook以外のプロバイダー(Google、Twitterなど)をサポートする

3
Pixel Elephant
1
Peter Knego

FacebookのJava APIを確認してください。

その他の例: http://code.google.com/p/facebook-Java-api/wiki/Examples

0
Adrian