开发者

Which Google api to use for getting user's first name, last name, picture, etc?

I have the oauth authorization with google working correctly and am getting data from the contacts api. Now, I want to programmatically get a gmail user's f开发者_如何学Pythonirst name, last name and picture. Which google api can i use to get this data?


The contacts API perhaps works, but you have to request permission from the user to access all contacts. If I were a user, that would make me wary of granting the permission (because this essentially gives you permission to spam all my contacts...)

I found the response here to be useful, and only asks for "basic profile information":

Get user info via Google API

I have successfully used this approach, and can confirm it returns the following Json object:

{
  "id": "..."
  "email": "...",
  "verified_email": true,
  "name": "....",
  "given_name": "...",
  "family_name": "...",
  "link": "...",
  "picture": "...",
  "gender": "male",
  "locale": "en"
}


Use this code to get firstName and lastName of a google user:

final HttpTransport transport = new NetHttpTransport();
final JsonFactory jsonFactory = new JacksonFactory();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(clientId))
        .setIssuer("https://accounts.google.com")
        .build();

GoogleIdToken idToken = null;
try {
    idToken = verifier.verify(googleAuthenticationPostResponse.getId_token());
} catch (GeneralSecurityException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
GoogleIdToken.Payload payload = null;
if (idToken != null) {
    payload = idToken.getPayload();
}
String firstName = payload.get("given_name").toString();
String lastName = payload.get("family_name").toString();


If you're using the google javascript API, you can use the new "auth2" API after authenticating to get the user's profile, containing:

  • name
  • email
  • image URL

https://developers.google.com/identity/sign-in/web/reference#googleusergetbasicprofile


For the picture, you can use the Google contacts Data API too: see http://code.google.com/intl/fr/apis/contacts/docs/3.0/developers_guide_protocol.html#retrieving_photo


The simplest way to get this information would be from the Google + API. Specifically the

https://developers.google.com/+/api/latest/people/get

When using the api use the following HTTP GET:

GET https://www.googleapis.com/plus/v1/people/me

This will return all of the above information requested from the user.


I found the answer while looking around in the contacts API forum. When you get the result-feed, just do the following in Java-

String Name = resultFeed.getAuthors().get(0).getName();

String emailId = resultFeed.getId();

I am still looking for a way to get the user profile picture.


Use this Code for Access Google Gmail Login Credential oAuth2 :

Class Name : OAuthHelper

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map.Entry;
import java.util.SortedSet;

import oauth.signpost.OAuth;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
import oauth.signpost.commonshttp.HttpRequestAdapter;
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;
import oauth.signpost.exception.OAuthNotAuthorizedException;
import oauth.signpost.http.HttpParameters;
import oauth.signpost.signature.HmacSha1MessageSigner;
import oauth.signpost.signature.OAuthMessageSigner;

import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.util.Log;

public class OAuthHelper {

private static final String TAG = "OAuthHelper";
private OAuthConsumer mConsumer;
private OAuthProvider mProvider;
private String mCallbackUrl;

public OAuthHelper(String consumerKey, String consumerSecret, String scope, String callbackUrl) throws UnsupportedEncodingException {


    mConsumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);
    mProvider = new CommonsHttpOAuthProvider("https://www.google.com/accounts/OAuthGetRequestToken?scope=" + URLEncoder.encode(scope, "utf-8"), "https://www.google.com/accounts/OAuthGetAccessToken", "https://www.google.com/accounts/OAuthAuthorizeToken?hd=default");
    mProvider.setOAuth10a(true);
    mCallbackUrl = (callbackUrl == null ? OAuth.OUT_OF_BAND : callbackUrl);
}

public String getRequestToken() throws OAuthMessageSignerException, OAuthNotAuthorizedException, OAuthExpectationFailedException, OAuthCommunicationException {
    String authUrl = mProvider.retrieveRequestToken(mConsumer, mCallbackUrl);
    System.out.println("Gautam AUTH URL : " + authUrl);
    return authUrl;
}

public String[] getAccessToken(String verifier) throws OAuthMessageSignerException, OAuthNotAuthorizedException, OAuthExpectationFailedException, OAuthCommunicationException {
    mProvider.retrieveAccessToken(mConsumer, verifier);
    return new String[] { mConsumer.getToken(), mConsumer.getTokenSecret() };
}

public String[] getToken() {
    return new String[] { mConsumer.getToken(), mConsumer.getTokenSecret() };
}

public void setToken(String token, String secret) {
    mConsumer.setTokenWithSecret(token, secret);
}

public String getUrlContent(String url) throws OAuthMessageSignerException, OAuthExpectationFailedException, OAuthCommunicationException, IOException {
    HttpGet request = new HttpGet(url);
    // sign the request
    mConsumer.sign(request);
    // send the request
    HttpClient httpClient = new DefaultHttpClient();
    HttpResponse response = httpClient.execute(request);
    // get content
    BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
    StringBuffer sb = new StringBuffer("");
    String line = "";
    String NL = System.getProperty("line.separator");
    while ((line = in.readLine()) != null)
        sb.append(line + NL);
    in.close();
    System.out.println("gautam INFO : " + sb.toString());
    return sb.toString();
}

public String getUserProfile(String t0, String t1, String url) {

    try {
        OAuthConsumer consumer = new CommonsHttpOAuthConsumer(t0, t1);
        HttpGet request = new HttpGet(url);
        // sign the request
        consumer.sign(request);
        // send the request
        HttpClient httpClient = new DefaultHttpClient();
        HttpResponse response = httpClient.execute(request);


        BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        StringBuffer sb = new StringBuffer("");
        String line = "";
        //String NL = System.getProperty("line.separator");
        while ((line = in.readLine()) != null)
            sb.append(line );
        in.close();
        System.out.println("Gautam Profile  : " + sb.toString());
        return sb.toString();

    } catch (Exception e) {
        System.out.println("Error in Geting profile Info : " + e);
        return "";
    } 

}

public String buildXOAuth(String email) {
    String url = String.format("https://mail.google.com/mail/b/%s/smtp/", email);
    HttpRequestAdapter request = new HttpRequestAdapter(new HttpGet(url));

    // Sign the request, the consumer will add any missing parameters
    try {
        mConsumer.sign(request);
    } catch (OAuthMessageSignerException e) {
        Log.e(TAG, "failed to sign xoauth http request " + e);
        return null;
    } catch (OAuthExpectationFailedException e) {
        Log.e(TAG, "failed to sign xoauth http request " + e);
        return null;
    } catch (OAuthCommunicationException e) {
        Log.e(TAG, "failed to sign xoauth http request " + e);
        return null;
    }

    HttpParameters params = mConsumer.getRequestParameters();
    // Since signpost doesn't put the signature into params,
    // we've got to create it again.
    OAuthMessageSigner signer = new HmacSha1MessageSigner();
    signer.setConsumerSecret(mConsumer.getConsumerSecret());
    signer.setTokenSecret(mConsumer.getTokenSecret());
    String signature;
    try {
        signature = signer.sign(request, params);
    } catch (OAuthMessageSignerException e) {
        Log.e(TAG, "invalid oauth request or parameters " + e);
        return null;
    }
    params.put(OAuth.OAUTH_SIGNATURE, OAuth.percentEncode(signature));

    StringBuilder sb = new StringBuilder();
    sb.append("GET ");
    sb.append(url);
    sb.append(" ");
    int i = 0;
    for (Entry<String, SortedSet<String>> entry : params.entrySet()) {
        String key = entry.getKey();
        String value = entry.getValue().first();
        int size = entry.getValue().size();
        if (size != 1)
            Log.d(TAG, "warning: " + key + " has " + size + " values");
        if (i++ != 0)
            sb.append(",");
        sb.append(key);
        sb.append("=\"");
        sb.append(value);
        sb.append("\"");
    }
    Log.d(TAG, "xoauth encoding " + sb);

    Base64 base64 = new Base64();
    try {
        byte[] buf = base64.encode(sb.toString().getBytes("utf-8"));
        return new String(buf, "utf-8");
    } catch (UnsupportedEncodingException e) {
        Log.e(TAG, "invalid string " + sb);
    }

    return null;
}

}

//===================================

Create : WebViewActivity.class

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.Window;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;


public class WebViewActivity extends Activity {

//WebView webview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_PROGRESS);

    WebView webview = new WebView(this);
    webview.getSettings().setJavaScriptEnabled(true);
    setContentView(webview);

    // Load the page
    Intent intent = getIntent();
    if (intent.getData() != null) {
        webview.loadUrl(intent.getDataString());
    }

    webview.setWebChromeClient(new WebChromeClient() {
        // Show loading progress in activity's title bar.
        @Override
        public void onProgressChanged(WebView view, int progress) {
            setProgress(progress * 100);
        }
    });
    webview.setWebViewClient(new WebViewClient() {
        // When start to load page, show url in activity's title bar
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            setTitle(url);

            if (url.startsWith("my-activity")) {
                Intent result = new Intent();
                System.out.println("Gautam my-activity : " + url);
                result.putExtra("myurl", url);
                setResult(RESULT_OK, result);
                finish();

            }


        }


        @Override
         public void onPageFinished(WebView view, String url) {
            System.out.println("Gautam Page Finish...");
           CookieSyncManager.getInstance().sync();
           // Get the cookie from cookie jar.
           String cookie = CookieManager.getInstance().getCookie(url);
           System.out.println("Gautam Cookie : " + cookie);
           if (cookie == null) {
             return;
           }
           // Cookie is a string like NAME=VALUE [; NAME=VALUE]
           String[] pairs = cookie.split(";");
           for (int i = 0; i < pairs.length; ++i) {
             String[] parts = pairs[i].split("=", 2);
             // If token is found, return it to the calling activity.

             System.out.println("Gautam=> "+ parts[0] + "  =  " + parts[1]);
                if (parts.length == 2 && parts[0].equalsIgnoreCase("oauth_token")) {
                    Intent result = new Intent();
                    System.out.println("Gautam AUTH : " + parts[1]);
                    result.putExtra("token", parts[1]);
                    setResult(RESULT_OK, result);
                    finish();
                }
           }
         }



    });


}
}

//=========================

Call From : MainActivity.class

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import oauth.signpost.OAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.http.HttpResponse;


import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

Button btnLogin;

OAuthHelper MyOuthHelper;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnLogin = (Button)findViewById(R.id.btnLogin);
    btnLogin.setOnClickListener(this);


}


@Override
protected void onResume() {


    /*System.out.println("On Resume call ");
    try {
        String[] token = getVerifier();
        if (token != null){
            String accessToken[] = MyOuthHelper.getAccessToken(token[1]);           
        }           
    } catch (Exception e) {
        System.out.println("gautam error on Resume : " + e);
    }*/



    super.onResume();
}

private String[] getVerifier(String url) {
    // extract the token if it exists
    Uri uri = Uri.parse(url);
    if (uri == null) {
        return null;
    }
    String token = uri.getQueryParameter("oauth_token");
    String verifier = uri.getQueryParameter("oauth_verifier");
    return new String[] { token, verifier };
}


@Override
public void onClick(View v) {

    try {
        MyOuthHelper = new OAuthHelper("YOUR CLIENT ID", "YOUR SECRET KEY", "https://www.googleapis.com/auth/userinfo.profile", "my-activity://localhost");         
    } catch (Exception e) {
        System.out.println("gautam errorin Class call :  " + e);
    }

    try {
        String uri = MyOuthHelper.getRequestToken();

        Intent intent = new Intent(MainActivity.this, WebViewActivity.class);
        intent.setData(Uri.parse(uri));
        startActivityForResult(intent, 0);


 /*         startActivity(new Intent("android.intent.action.VIEW",
        Uri.parse(uri)));*/
    } catch (Exception e) {
        System.out.println("Gautm Error in getRequestTokan : " + e);

    }
}



@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   switch (requestCode) {
     case 0:
       if (resultCode != RESULT_OK || data == null) {
         return;
       }
       // Get the token.
       String url = data.getStringExtra("myurl");
       try {
            String[] token = getVerifier(url);
            if (token != null){
                String accessToken[] = MyOuthHelper.getAccessToken(token[1]);
                System.out.println("Gautam Final [0] : " + accessToken[0]  + "   , [1]  : " + accessToken[1]);

                //https://www.googleapis.com/oauth2/v1/userinfo?alt=json

 //                 String myProfile = MyOuthHelper.getUserProfile(accessToken[0], accessToken[1], "https://www.googleapis.com/oauth2/v1/userinfo?alt=json");
                String myProfile = MyOuthHelper.getUrlContent("https://www.googleapis.com/oauth2/v1/userinfo?alt=json");

            }           
        } catch (Exception e) {
            System.out.println("gautam error on Resume : " + e);
        }
       return;
   }
   super.onActivityResult(requestCode, resultCode, data);
 }





 }

//=================================

And Finally Your Profile Information coming, Just Look in your Logcat message print.

Note : Not Forgot to put Internet Permission in Manifest File

And Your App Register in Google Console for Client ID and Secret Key For App Registration Please Looking this Step : App Registration Step

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜