Android 如何在后台使用GoogleAppClient刷新身份验证令牌
我正在使用Android 如何在后台使用GoogleAppClient刷新身份验证令牌,android,google-oauth,okhttp,Android,Google Oauth,Okhttp,我正在使用GoogleAppClient来处理OAuth令牌,而不是AccountPicker。在LoginActivity中,它优雅地处理Oauth流,我可以通过调用getAuthToken轻松地获得令牌。但像所有Oauth令牌一样,这个令牌可能会过期,我需要在没有用户干预的情况下续订,因为在登录期间,用户已经授予了应用程序的许可。我正在使用OkHttp验证器更新令牌,但问题是GoogleAppClient需要活动来处理oAuth流,但我需要在不影响令牌的情况下更新令牌 我研究的另一种方法是A
GoogleAppClient
来处理OAuth令牌,而不是AccountPicker
。在LoginActivity中,它优雅地处理Oauth流,我可以通过调用getAuthToken轻松地获得令牌。但像所有Oauth令牌一样,这个令牌可能会过期,我需要在没有用户干预的情况下续订,因为在登录期间,用户已经授予了应用程序的许可。我正在使用OkHttp验证器
更新令牌,但问题是GoogleAppClient需要活动来处理oAuth流,但我需要在不影响令牌的情况下更新令牌
我研究的另一种方法是AccountPicker
,它不需要用户干预就可以处理它
那么,正确的方法应该是什么呢
在首次登录期间使用GoogleAppClient并将电子邮件地址存储在SharedReferences中,以及在后台使用AccountPicker重新验证令牌
FWIW,这是我的后勤工作
package in.jatindhankhar.shorl.ui;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.StringDef;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.Scopes;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.Scope;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import in.jatindhankhar.shorl.R;
import in.jatindhankhar.shorl.model.AsyncResponse;
import in.jatindhankhar.shorl.network.GetToken;
import in.jatindhankhar.shorl.utils.Constants;
import in.jatindhankhar.shorl.utils.Utils;
public class LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener, AsyncResponse {
private static final String TAG = LoginActivity.class.getSimpleName();
private static final int ACCOUNT_CODE = 1601;
final private Scope URL_SCOPE = new Scope(Constants.URL_API);
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.sign_in_button)
SignInButton signInButton;
private GoogleApiClient mGoogleApiClient;
private Context mContext;
private AccountManager mAccountManager;
private String mAuthTokenType;
public String mAccountName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
mContext = getApplicationContext();
// Configure sign-in to request the user's ID, email address, and basic
// profile. ID and basic profile are included in DEFAULT_SIGN_IN.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail().requestScopes(URL_SCOPE).requestId().requestId()
.build();
// Build a GoogleApiClient with access to the Google Sign-In API and the
// options specified by gso.
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* Activity */, this /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
// Prepare the account manager
mAccountManager = AccountManager.get(mContext);
String accountName = getIntent().getStringExtra(Constants.ARG_ACCOUNT_NAME);
mAuthTokenType = getIntent().getStringExtra(Constants.ARG_AUTH_TYPE);
chooseAccount();
if (mAuthTokenType == null)
mAuthTokenType ="Full access";
signInButton.setSize(SignInButton.SIZE_WIDE);
}
@Override
protected void onResume() {
super.onResume();
mContext = getApplicationContext();
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@OnClick(R.id.sign_in_button)
public void signIn() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, Constants.RC_SIGN_IN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
if (requestCode == Constants.RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);
}
}
private void handleSignInResult(GoogleSignInResult result) {
Log.d(TAG, "handleSignInResult:" + result.isSuccess());
if (result.isSuccess()) {
// Signed in successfully, show authenticated UI.
GoogleSignInAccount acct = result.getSignInAccount();
if (acct != null) {
mAccountName = acct.getDisplayName();
}
new GetToken(this,acct.getAccount(),Constants.URL_SHORTNER_SCOPE,this).execute();
} else {
// Signed out, show unauthenticated UI.
//updateUI(false);
}
}
private void updateUI(boolean loginSuccess) {
if(loginSuccess)
{
Utils.setLoginSession(mContext,mAccountName);
startActivity(new Intent(mContext,MainActivity.class));
}
else
{
Utils.clearLoginSuccess(mContext);
}
}
@Override
public void processFinish(String output) {
final Account account = new Account(mAccountName, Constants.PACKAGE_NAME);
if (getIntent().getBooleanExtra(Constants.ARG_IS_ADDING_NEW_ACCOUNT, false)) {
String authtokenType = mAuthTokenType;
mAccountManager.addAccountExplicitly(account, "", null);
mAccountManager.setAuthToken(account, authtokenType, output);
} else {
// Just reset the token
mAccountManager.setAuthToken(account,mAuthTokenType,output);
}
Utils.setLoginSession(mContext,mAccountName);
startActivity(new Intent(this,MainActivity.class));
}
private void chooseAccount() {
// use https://github.com/frakbot/Android-AccountChooser for
// compatibility with older devices
Intent intent = AccountManager.newChooseAccountIntent(null, null,
new String[] { "com.google" }, false, null, null, null, null);
startActivityForResult(intent, ACCOUNT_CODE);
}
}
这是我的GetToken任务
package in.jatindhankhar.shorl.network;
import android.accounts.Account;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import com.google.android.gms.auth.GoogleAuthException;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.UserRecoverableAuthException;
import java.io.IOException;
import in.jatindhankhar.shorl.model.AsyncResponse;
/**
* Created by jatin on 12/12/16.
*/
public class GetToken extends AsyncTask<Void,Void,String> {
private static final String TAG = GetToken.class.getSimpleName();
private Context mAppContext;
private Account mAccountName;
private String AUTH_TOKEN_TYPE;
public AsyncResponse delegate = null;
public GetToken(Context mAppContext,Account mAccountName,String AUTH_TOKEN_TYPE,AsyncResponse delegate)
{
this.mAppContext = mAppContext;
this.mAccountName = mAccountName;
this.AUTH_TOKEN_TYPE = AUTH_TOKEN_TYPE;
this.delegate = delegate;
}
@Override
protected String doInBackground(Void... params) {
try {
if(isCancelled())
{
Log.d(TAG,"doInBackground: task cancelled, so giving up on auth.");
return null;
}
final String token = GoogleAuthUtil.getToken(mAppContext, mAccountName, AUTH_TOKEN_TYPE);
Log.d(TAG,"So token is " + token);
return token;
} catch (UserRecoverableAuthException e) {
e.printStackTrace();
} catch (GoogleAuthException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
//super.onPostExecute(s);
delegate.processFinish(s);
}
}
package in.jatindhankhar.shorl.network;
导入android.accounts.Account;
导入android.content.Context;
导入android.os.AsyncTask;
导入android.util.Log;
导入com.google.android.gms.auth.GoogleAuthException;
导入com.google.android.gms.auth.GoogleAuthUtil;
导入com.google.android.gms.auth.UserRecoverableAuthException;
导入java.io.IOException;
导入in.jatindhankhar.shorl.model.AsyncResponse;
/**
*由jatin于2016年12月12日创建。
*/
公共类GetToken扩展异步任务{
私有静态最终字符串标记=GetToken.class.getSimpleName();
私有上下文映射上下文;
私人帐户名称;
私有字符串身份验证令牌类型;
公共异步响应委托=null;
公共GetToken(上下文映射上下文、帐户mAccountName、字符串身份验证\u令牌\u类型、异步响应委托)
{
this.mAppContext=mAppContext;
this.mAccountName=mAccountName;
this.AUTH\u TOKEN\u TYPE=AUTH\u TOKEN\u TYPE;
this.delegate=委托;
}
@凌驾
受保护字符串doInBackground(无效…参数){
试一试{
如果(isCancelled())
{
d(标记“doInBackground:任务已取消,因此放弃身份验证”);
返回null;
}
最终字符串标记=GoogleAuthUtil.getToken(mAppContext、mAccountName、AUTH_标记类型);
Log.d(标记“So token是”+token);
返回令牌;
}捕获(UserRecoverableAuthe异常){
e、 printStackTrace();
}捕获(googleauthe异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串s){
//super.onPostExecute(s);
代表。进程完成;
}
}