Android - Oauth2, AccountManager和谷歌:检索配置文件数据



我正在制作一个应用程序,应该允许用户通过其谷歌帐户注册。我想自动检索尽可能多的配置文件信息,我可以。我发现了这个非常有趣的例子,它可以让我获得很多信息(参见演示的第4步)。现在,我如何在android上使用它?我看到了许多关于如何使用Oauth2的AccountManager获得身份验证令牌的示例(示例),但我不知道从那里做什么来进行这些调用并检索这些信息。同样在那个例子中,代码是在javascript,我不知道如何正确地移植到java…
我已经做了谷歌开发控制台注册的东西。Oauth2和OpenID是一样的吗?如果没有,我必须使用其中一个还是另一个?

好了。正如预期的那样,我在文档中找到了所有的信息,并且使用谷歌的Oauth2 Playground帮助我理解了为了接收配置文件数据,应该向https://www.googleapis.com/oauth2/v1/userinfo发送什么。最后,事实证明我们不需要在google的开发控制台中创建客户端ID来完成此操作。
现在来看代码。活动:

public class MainActivity extends Activity {
    public Activity mContext;
    private AccountManager accountManager;
    private final String SCOPES = "oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile";
    private String authToken;
    private GetProfileDataTask googleTask;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
        mContext = this;
        accountManager = AccountManager.get(mContext);
        //other stuff here...
    }
    public void getProfileData() {
        accountManager.getAuthTokenByFeatures(
                "com.google", 
                SCOPES, 
                null, mContext, null, null, 
                new AccountManagerCallback<Bundle>() {
                    public void run(AccountManagerFuture<Bundle> future) {
                        try {
                            Bundle bundle = future.getResult();
                            //bundle.getString(AccountManager.KEY_ACCOUNT_NAME);
                            //bundle.getString(AccountManager.KEY_ACCOUNT_TYPE);
                            authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
                        } catch (Exception e) {
                            System.out.println("getAuthTokenByFeatures() cancelled or failed:");
                            e.printStackTrace();
                            authToken = "failure";
                        }
                        if(!authToken.equals("failure")) {
                            googleTask = new GetProfileDataTask();
                            googleTask.execute(authToken);
                        }
                    }
                }, null);
    }
}

获取数据的AsyncTask:

public class GetProfileDataTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... tokens) {
        RestTemplate restTemplate = new RestTemplate(false);
        restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
        String json = null;
        try {
                //the response is of type "application/json"
            json = restTemplate.getForObject(
                    "https://www.googleapis.com/oauth2/v1/userinfo" + 
                    "?access_token={token}" + 
                    "&access_token_type=bearer", 
                    String.class, 
                    tokens[0]); //this is the authToken from before, obv
        } catch(RestClientException er) {
            Log.e("GetProfileDataTask", er.toString(), er);
            json = null;
        }
        return json;
    }
    @Override
    protected void onPostExecute(String asyncResult) {
        if(asyncResult != null)
            //do something with your data, for example deserialize it
        else
            //do something else
    }
}

收到的json是这样的:

{
  "family_name": "Smith", 
  "name": "John Smith", 
  "picture": "https://lh3.googleusercontent.com/-randomlettersandnumbers/AAAAAAAAAAI/AAAAAAAAAAA/morerandomlettersandnumbers/photo.jpg", 
  "locale": "it", 
  "gender": "male", 
  "email": "youremail@whatever.itis", 
  "link": "https://plus.google.com/133780085840848123456", 
  "given_name": "John", 
  "id": "133780085840848123456", 
  "verified_email": true
}

既然你想让用户通过他们的Google帐户登录你的应用程序,你可以使用OpenID,并且Google支持它。

注意:如果你提供"登录与谷歌"的功能,我们建议使用谷歌+登录。

如果你只想代表用户在Google中获取用户的信息,你可以使用Oauth2。参考Google的官方文件,我觉得他们详细,权威,容易相处。

如本文档所述:

5。从ID令牌

获取用户信息

ID令牌是一个以64为基数编码的加密签名JSON对象。通常,在使用ID令牌之前验证它是至关重要的,但由于您通过无中介的HTTPS通道直接与Google通信,并使用您的客户端秘密向Google验证自己,因此您可以确信您收到的令牌确实来自Google并且是有效的。

总之,仔细阅读这些文档,你会清楚如何完成你的应用。