XMPP with Java Asmack library supporting X-FACEBOOK-PLATFORM

后端 未结 5 1219
栀梦
栀梦 2020-11-29 03:55

I\'m trying to make a Facebook Chat on Android with the Smack library. I\'ve read the Chat API from Facebook, but I cannot understand how I have to authenticate with Faceboo

5条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-29 04:06

    Here's code I've been using successfully for authentication. Maybe this helps even though this is not related to Smack in any way. You can get sessionKey from access token received from FB, and for getting sessionSecret I've been using oldish REST API;

    http://developers.facebook.com/docs/reference/rest/auth.promoteSession/

    private final void processChallenge(XmlPullParser parser, Writer writer,
            String sessionKey, String sessionSecret) throws IOException,
            NoSuchAlgorithmException, XmlPullParserException {
    
        parser.require(XmlPullParser.START_TAG, null, "challenge");
        String challenge = new String(Base64.decode(parser.nextText(),
                Base64.DEFAULT));
    
        String params[] = challenge.split("&");
        HashMap paramMap = new HashMap();
        for (int i = 0; i < params.length; ++i) {
            String p[] = params[i].split("=");
            p[0] = URLDecoder.decode(p[0]);
            p[1] = URLDecoder.decode(p[1]);
            paramMap.put(p[0], p[1]);
        }
    
        String api_key = "YOUR_API_KEY";
        String call_id = "" + System.currentTimeMillis();
        String method = paramMap.get("method");
        String nonce = paramMap.get("nonce");
        String v = "1.0";
    
        StringBuffer sigBuffer = new StringBuffer();
        sigBuffer.append("api_key=" + api_key);
        sigBuffer.append("call_id=" + call_id);
        sigBuffer.append("method=" + method);
        sigBuffer.append("nonce=" + nonce);
        sigBuffer.append("session_key=" + sessionKey);
        sigBuffer.append("v=" + v);
        sigBuffer.append(sessionSecret);
    
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(sigBuffer.toString().getBytes());
        byte[] digest = md.digest();
    
        StringBuffer sig = new StringBuffer();
        for (int i = 0; i < digest.length; ++i) {
            sig.append(Integer.toHexString(0xFF & digest[i]));
        }
    
        StringBuffer response = new StringBuffer();
        response.append("api_key=" + URLEncoder.encode(api_key));
        response.append("&call_id=" + URLEncoder.encode(call_id));
        response.append("&method=" + URLEncoder.encode(method));
        response.append("&nonce=" + URLEncoder.encode(nonce));
        response.append("&session_key=" + URLEncoder.encode(sessionKey));
        response.append("&v=" + URLEncoder.encode(v));
        response.append("&sig=" + URLEncoder.encode(sig.toString()));
    
        StringBuilder out = new StringBuilder();
        out.append("");
        out.append(Base64.encodeToString(response.toString().getBytes(),
                Base64.NO_WRAP));
        out.append("");
    
        writer.write(out.toString());
        writer.flush();
    }
    

提交回复
热议问题