我正在制作一款应该允许用户通过其Google帐户注册的应用。我想自动检索尽可能多的个人资料信息。我找到this very interesting example,这将允许我获得许多信息(参见该演示的第4步)。现在,我如何在Android上使用它?我看到了许多如何使用带有Oauth2(example)的AccountManager获取身份验证令牌的示例,但我不知道该怎么做才能进行这些调用并检索这些信息。同样在该示例中,代码是在javascript中,我不知道如何将其正确地移植到java ...
我已经完成了谷歌开发控制台注册的东西
Oauth2和OpenID是一回事吗?如果没有,我是否必须使用其中一个或另一个?
答案 0 :(得分:3)
好的,完成了。正如预期的那样,我找到了文档中的所有信息,并使用Google 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
}
答案 1 :(得分:1)
由于您希望允许用户通过其Google帐户登录您的应用,因此您可以使用OpenID and Google supports it。
注意:如果您提供“使用Google登录”功能,我们建议using Google+ Sign-In。
如果您只想代表用户在Google中获取用户信息,则可以使用Oauth2。请参阅Google的官方文档,我认为它们详细,权威,易于相处。
正如this doc所说:
5.从ID令牌中获取用户信息
ID令牌是以base 64编码的加密签名的JSON对象。通常,在使用之前验证ID令牌至关重要,但是因为您通过以下方式直接与Google通信无中间的HTTPS渠道并使用您的客户密码向Google自行验证,您可以确信您收到的令牌确实来自Google且有效。
总而言之,请仔细阅读这些文档,并明确了解如何完成应用。