Failed to receive access token原因
2014-05-04 17:05
351 查看
在做一个新项目的时候 突然发现新浪认证不能用了 出现Failed
to receive access token
经过查实 原来是2013年8月份以后的一些应用 (有些可以继续用 有些不能)对应的验证方式更改了 之前是token现在改成code ,经过参考http://my.oschina.net/u/347158/blog/160709 改了适合自己的方式 发现完全可行
如下 :
private void startDialogAuth(Activity activity, String[] permissions) {
final Context context = activity;
WeiboParameters params = new WeiboParameters();
if (permissions.length > 0) {
params.add("scope", TextUtils.join(",", permissions));
}
CookieSyncManager.createInstance(activity);
dialog(activity, params, new WeiboDialogListener() {
public void onComplete(Bundle values) {
// ensure any cookies set by the dialog are saved
final Bundle bundle=values;
final String code = values.getString(Weibo.TOKEN_CODE);
if (!Tool.isStringDataNull(code)) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Oauth2AccessToken tok = getNewOauth2AccessToken(context, code);
checkTokenRight(bundle,tok.getToken(),tok.getExpiresIn()+"",tok.getUseid());
} catch (WeiboException e) {
mAuthDialogListener.onWeiboException(e);
}
}
}).start();
} else {
checkTokenRight(values,values.getString(TOKEN),values.getString(EXPIRES),values.getString(Weibo.USER_ID));
}
}
public void checkTokenRight(Bundle values,String token,String expiresIn,String userId) {
CookieSyncManager.getInstance().sync();
if (null == mAccessToken) {
mAccessToken = new Token();
}
mAccessToken.setToken(token);
mAccessToken.setExpiresIn(expiresIn);
if (isSessionValid()) {
Log.d("Weibo-authorize", "Login Success! access_token="
+ mAccessToken.getToken() + " expires="
+ mAccessToken.getExpiresIn());
values.putString(Weibo.TOKEN, token);
values.putString(Weibo.USER_ID, userId);
values.putString(Weibo.EXPIRES, expiresIn);
mAuthDialogListener.onComplete(values);
} else {
Log.d("Weibo-authorize", "Failed to receive access token");
mAuthDialogListener.onWeiboException(new WeiboException(
"Failed to receive access token."));
}
}
public void onError(DialogError error) {
Log.d("Weibo-authorize", "Login failed: " + error);
mAuthDialogListener.onError(error);
}
public void onWeiboException(WeiboException error) {
Log.d("Weibo-authorize", "Login failed: " + error);
mAuthDialogListener.onWeiboException(error);
}
public void onCancel() {
Log.d("Weibo-authorize", "Login canceled");
mAuthDialogListener.onCancel();
}
});
}
//新的code方式更改
public Oauth2AccessToken getNewOauth2AccessToken(Context context,
String code) throws WeiboException {
Utility.setAuthorization(new Oauth2AccessTokenHeader());
WeiboParameters postParams = new WeiboParameters();
SplashData aplashData = Tool.fetchSplashData(context);
ShareApiModel shareApiModel = SplashData.backShareApiModel(aplashData,
"SinaWeibo");
String oauth_consumer_key = shareApiModel.getAppKey();
String oauth_consumer_secret = shareApiModel.getAppsecret();
String oauth_consumer_url = shareApiModel.getRedirect_uri();
postParams.add("client_id", oauth_consumer_key);
postParams.add("client_secret", oauth_consumer_secret);
postParams.add("grant_type", "authorization_code");
postParams.add("redirect_uri", oauth_consumer_url);
postParams.add("code", code);
String rlt = Utility.openUrl(context, Weibo.URL_OAUTH2_ACCESS_TOKEN,
"POST", postParams, null);
Oauth2AccessToken accessToken = new Oauth2AccessToken(rlt);
this.mAccessToken = accessToken;
return accessToken;
}
参考的代码为:
获取不到accessToken,而是授权成功只返回个code,新浪提供了接口可以通过code取accessToken,
/* 新浪微博授权成功回调方法 /
@Override
public void onComplete(Bundle values) {
final String code = values.getString("code");
token = values.getString("access_token");
expires_in = values.getString("expires_in");
if(TommyTools.isNull(token)){
accessToken = new Oauth2AccessToken(token, expires_in);
if (accessToken.isSessionValid()) {
AccessTokenKeeper.keepAccessToken(activity, accessToken);
Toast.makeText(activity, "认证成功", Toast.LENGTH_SHORT).show();
}
}else if (code != null) {//下面是通过code取accessToken
new Thread(){
@Override
public void run() {
String result = "";
WeiboParameters params = new WeiboParameters();
params.add("client_id", Constant.APP_KEY);
params.add("client_secret", "1f39c10940fa0d3b1001e439c4a99ccb");
params.add("grant_type", "authorization_code");
params.add("redirect_uri", Constant.REDIRECT_URL);
params.add("code", code);
try {
result = HttpManager.openUrl("https://api.weibo.com/oauth2/access_token", "POST",
params, null);
} catch (WeiboException e) {
e.printStackTrace();
}
JSONObject json;
try {
json = new JSONObject(result);
token = json.getString("access_token");
expires_in = json.getString("expires_in");
handler.sendEmptyMessage(1);
} catch (JSONException e) {
e.printStackTrace();
}
}
}.start();
}else{
return;
}
}
@Override
public void onError(WeiboDialogError e) {
Toast.makeText(activity, "Auth error : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onCancel() {
Toast.makeText(activity, "Auth cancel", Toast.LENGTH_LONG).show();
}
@Override
public void onWeiboException(WeiboException arg0) {
}
}
@Override
public void handleMessage(Message msg) {
if(msg.what == 1){
if(TommyTools.isNull(token) && TommyTools.isNull(expires_in)){
accessToken = new Oauth2AccessToken(token, expires_in);
if (accessToken.isSessionValid()) {
AccessTokenKeeper.keepAccessToken(activity, accessToken);
Toast.makeText(activity, "认证成功", Toast.LENGTH_SHORT).show();
}
}
}
}
};可以看到,我在授权成功回调那里做了个判断,先判断token为不为空,直接说原因,是因为在申请appKey时android需要填写包名和应用签名,如果打的包用的签名和填写在上面的一致,授权成功会直接返回token,不需要在调接口获取,如果签名不一致,授权就只返回一个code码,然后通过code码再获取token
to receive access token
经过查实 原来是2013年8月份以后的一些应用 (有些可以继续用 有些不能)对应的验证方式更改了 之前是token现在改成code ,经过参考http://my.oschina.net/u/347158/blog/160709 改了适合自己的方式 发现完全可行
如下 :
private void startDialogAuth(Activity activity, String[] permissions) {
final Context context = activity;
WeiboParameters params = new WeiboParameters();
if (permissions.length > 0) {
params.add("scope", TextUtils.join(",", permissions));
}
CookieSyncManager.createInstance(activity);
dialog(activity, params, new WeiboDialogListener() {
public void onComplete(Bundle values) {
// ensure any cookies set by the dialog are saved
final Bundle bundle=values;
final String code = values.getString(Weibo.TOKEN_CODE);
if (!Tool.isStringDataNull(code)) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Oauth2AccessToken tok = getNewOauth2AccessToken(context, code);
checkTokenRight(bundle,tok.getToken(),tok.getExpiresIn()+"",tok.getUseid());
} catch (WeiboException e) {
mAuthDialogListener.onWeiboException(e);
}
}
}).start();
} else {
checkTokenRight(values,values.getString(TOKEN),values.getString(EXPIRES),values.getString(Weibo.USER_ID));
}
}
public void checkTokenRight(Bundle values,String token,String expiresIn,String userId) {
CookieSyncManager.getInstance().sync();
if (null == mAccessToken) {
mAccessToken = new Token();
}
mAccessToken.setToken(token);
mAccessToken.setExpiresIn(expiresIn);
if (isSessionValid()) {
Log.d("Weibo-authorize", "Login Success! access_token="
+ mAccessToken.getToken() + " expires="
+ mAccessToken.getExpiresIn());
values.putString(Weibo.TOKEN, token);
values.putString(Weibo.USER_ID, userId);
values.putString(Weibo.EXPIRES, expiresIn);
mAuthDialogListener.onComplete(values);
} else {
Log.d("Weibo-authorize", "Failed to receive access token");
mAuthDialogListener.onWeiboException(new WeiboException(
"Failed to receive access token."));
}
}
public void onError(DialogError error) {
Log.d("Weibo-authorize", "Login failed: " + error);
mAuthDialogListener.onError(error);
}
public void onWeiboException(WeiboException error) {
Log.d("Weibo-authorize", "Login failed: " + error);
mAuthDialogListener.onWeiboException(error);
}
public void onCancel() {
Log.d("Weibo-authorize", "Login canceled");
mAuthDialogListener.onCancel();
}
});
}
//新的code方式更改
public Oauth2AccessToken getNewOauth2AccessToken(Context context,
String code) throws WeiboException {
Utility.setAuthorization(new Oauth2AccessTokenHeader());
WeiboParameters postParams = new WeiboParameters();
SplashData aplashData = Tool.fetchSplashData(context);
ShareApiModel shareApiModel = SplashData.backShareApiModel(aplashData,
"SinaWeibo");
String oauth_consumer_key = shareApiModel.getAppKey();
String oauth_consumer_secret = shareApiModel.getAppsecret();
String oauth_consumer_url = shareApiModel.getRedirect_uri();
postParams.add("client_id", oauth_consumer_key);
postParams.add("client_secret", oauth_consumer_secret);
postParams.add("grant_type", "authorization_code");
postParams.add("redirect_uri", oauth_consumer_url);
postParams.add("code", code);
String rlt = Utility.openUrl(context, Weibo.URL_OAUTH2_ACCESS_TOKEN,
"POST", postParams, null);
Oauth2AccessToken accessToken = new Oauth2AccessToken(rlt);
this.mAccessToken = accessToken;
return accessToken;
}
参考的代码为:
获取不到accessToken,而是授权成功只返回个code,新浪提供了接口可以通过code取accessToken,
/* 新浪微博授权成功回调方法 /
@Override
public void onComplete(Bundle values) {
final String code = values.getString("code");
token = values.getString("access_token");
expires_in = values.getString("expires_in");
if(TommyTools.isNull(token)){
accessToken = new Oauth2AccessToken(token, expires_in);
if (accessToken.isSessionValid()) {
AccessTokenKeeper.keepAccessToken(activity, accessToken);
Toast.makeText(activity, "认证成功", Toast.LENGTH_SHORT).show();
}
}else if (code != null) {//下面是通过code取accessToken
new Thread(){
@Override
public void run() {
String result = "";
WeiboParameters params = new WeiboParameters();
params.add("client_id", Constant.APP_KEY);
params.add("client_secret", "1f39c10940fa0d3b1001e439c4a99ccb");
params.add("grant_type", "authorization_code");
params.add("redirect_uri", Constant.REDIRECT_URL);
params.add("code", code);
try {
result = HttpManager.openUrl("https://api.weibo.com/oauth2/access_token", "POST",
params, null);
} catch (WeiboException e) {
e.printStackTrace();
}
JSONObject json;
try {
json = new JSONObject(result);
token = json.getString("access_token");
expires_in = json.getString("expires_in");
handler.sendEmptyMessage(1);
} catch (JSONException e) {
e.printStackTrace();
}
}
}.start();
}else{
return;
}
}
@Override
public void onError(WeiboDialogError e) {
Toast.makeText(activity, "Auth error : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onCancel() {
Toast.makeText(activity, "Auth cancel", Toast.LENGTH_LONG).show();
}
@Override
public void onWeiboException(WeiboException arg0) {
}
}
@Override
public void handleMessage(Message msg) {
if(msg.what == 1){
if(TommyTools.isNull(token) && TommyTools.isNull(expires_in)){
accessToken = new Oauth2AccessToken(token, expires_in);
if (accessToken.isSessionValid()) {
AccessTokenKeeper.keepAccessToken(activity, accessToken);
Toast.makeText(activity, "认证成功", Toast.LENGTH_SHORT).show();
}
}
}
}
};可以看到,我在授权成功回调那里做了个判断,先判断token为不为空,直接说原因,是因为在申请appKey时android需要填写包名和应用签名,如果打的包用的签名和填写在上面的一致,授权成功会直接返回token,不需要在调接口获取,如果签名不一致,授权就只返回一个code码,然后通过code码再获取token
相关文章推荐
- android新浪微博开发failed to receive access token 的解决办法
- 关于新浪微博SSO授权时出现 Weibo-authorize Failed to receive access token by SSO 的问题解决
- 新浪微博登陆 failed to recieve the access token
- 【转】wait_fences: failed to receive reply: 10004003问题的引起原因
- wait_fences: failed to receive reply: 10004003问题的引起原因
- weibo 登录 Failed receive access token
- wait_fences: failed to receive reply: 10004003问题的引起原因
- Windows下的 "InternalOAuthError: Failed to obtain access token" 解决方案记录
- Github:failed to add file / to index原因
- 在VC++6.0中出现failed to (or don't know how to) build 原因及解决方法
- The message was undeliverable. All servers failed to receive the message
- 使用github出了些问题?fatal: unable to access;Failed connect to github.com:8087;
- bind() to 0.0.0.0:443 failed (10013: An attempt was made to access a socket in a way forbidden by it
- mount:RPC:Unable to receive;errno=No route to host原因及nfs安装
- Failed to load http://localhost:8080/team.php: Request header field x-jwt-header is not allowed by Access-Control-Allow-Headers in preflight response.
- javax.xml.soap.SOAPException: Unable to receive message 原因
- quartus II 15.0 中解决仿真报错 Error: (vsim-19) Failed to access library 的问题
- svn Failed to load the AuthzSVNAccessFile - Section header expected
- jmail发送邮件出错,jmail.Message: The message was undeliverable. All servers failed to receive
- phpMyAdmin - Error:Failed to generate random CSRF token!