开发者可以通过YunOS帐号授权机制,来获取用户基本信息,进而实现业务逻辑。
可以与开放平台SDK整体使用,也可以单独集成openauthsdk-1.x.x.jar编译使用。
必须要在你的Manifest文件中声明如下权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
帐号SDK主要是提供YunOS帐号授权登录功能。
开发者App接入该SDK后,可以使用YunOS系统帐号授权Service完成授权登录。授权成功后,则返回当前YunOS帐号的授权码、用户ID等信息。使用AuthClient类对外提供授权接口。
根据应用可获取帐号信息的级别,授权分为两类。具体可使用的授权级别,需要App在申请SDK时一次性确认的,且后续不可变更。
所有的接口调用会在IYunOSAuthCallBack对象中回调,回调触发在主线程,业务方若在回调后需要做网络请求等耗时操作,请务必创建线程处理。
开发者可以使用AuthClient.getInstance(this.getApplicationContext(), appKey)创建AuthClient实例进行接口调用。
考虑开发者在授权登录页面的横屏需求,在创建AuthClient实例时增加了横屏传参;但由于各个手机系统版本的兼容性有差异,有些版本上横屏支持存在问题,即便是传了横屏参数,也只能竖屏显示。
AuthClient.getInstance(this.getApplicationContext(), appKey, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
授权接口,可以使用当前系统帐号授权,也可以使用切换帐号授权(为用户级授权App提供,如游戏应用中切换小号)。
支持旧版本YunOS系统的兼容模式,但只能使用淘宝账号授权,且无法切换帐号。
授权成功后,解析返回的authorizeCode,可调用服务端开放接口open.apply_auth_token_by_authcode,获取AccessToken。
返回格式如下:
{"appKey":"e0b476b3adf21533d272c2de5e8466d8","uid":"9544B83DE5BA9D70A6DD62546F5AA96B6E2087913A671FFEE06C1F7D4473C4E5","userInfo":{},"authorizeCode ":"fQEOCv4bR-iQJJfXX2mqzQ"}
AlibabaSDK异步初始化成功后使用。
public void authorize(Activity activity, int requestCode,final boolean forceLogin,final boolean forceUpdate, final IYunOSAuthCallBack callBack)
参数 |
参数说明 |
参数要求 |
activity |
当前调用Activity |
必选 |
requestCode |
兼容老版本SDK使用,SDK中会startActivityForResult,必须>0 |
必选 |
forceLogin |
True表示使用切换帐号模式,不使用当前系统帐号授权 |
可选,默认false |
forceUpdate |
True表示不使用兼容模式,不使用淘宝帐号授权,必须使用YunOS帐号授权 |
可选,默认false |
callBack |
回调对象 |
必选 |
AuthClient.getInstance(activity.getApplicationContext(), appKey).authorize(activity, 1, forceLogin, forceUpdate, new IYunOSAuthCallBack() {
@Override
public void onComplete(String data) {
Toast.makeText(activity, "authorize onComplete---" + data, Toast.LENGTH_LONG).show();
}
@Override
public void onError(int error, String msg) {
Toast.makeText(activity, "authorize error: " + error + "; error msg "+ msg, Toast.LENGTH_LONG).show();
}
});
开发者在服务端配置正确的应用信息,在用户授权过程中,除了用户取消外,一般都会授权成功回调onComplete函数。
错误码 |
含义 |
-1 |
用户取消授权(老系统帐号版本) |
-2 |
系统授权服务绑定失败 |
-3 |
无网络 |
202 |
系统需要升级才能支持请求的授权服务 |
10105 |
用户取消授权(新系统帐号版本) |
为兼容旧版系统的startActivityForResult授权方式,需要开发者重写Activity的onActivityResult方法,如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
AuthClient.getInstance(this, appkey).authorizeCallBack(requestCode, resultCode, data);
}
获取已经授权成功的帐号信息,返回用户ID 及其他帐号信息。
已经成功调用过authorize接口。
public void getAccountInfo(final IYunOSAuthCallBack callBack)
AuthClient.getInstance(activity.getApplicationContext(), appKey).getAccountInfo(new IYunOSAuthCallBack() {
@Override
public void onComplete(final String accountInfo) {
Toast.makeText(activity, "accountInfo: " + accountInfo, Toast.LENGTH_SHORT).show();
}
@Override
public void onError(int error, String msg) {
Toast.makeText(activity, "getAccountInfo error: " + error + "; error msg "+ msg, Toast.LENGTH_SHORT).show();
}
});
获取匿名YunID。
public void getAnonymousYunID(final IYunOSAuthCallBack callBack)
AuthClient.getInstance(activity.getApplicationContext(), appKey).getAnonymousYunID(new IYunOSAuthCallBack() {
@Override
public void onComplete(final String yunID) {
Toast.makeText(activity, "yunID: " + yunID, Toast.LENGTH_SHORT).show();
}
@Override
public void onError(int error, String msg) {
Toast.makeText(activity, "getAnonymousYunID error: " + error + "; error msg "+ msg, Toast.LENGTH_SHORT).show();
}
});
1、请确认已在open.yunos.com申请应用并获得“YunOS-账号授权API”权限包
2、在open.yunos.com应用管理页面生成服务端SDK
3、java、maven运行环境,tomcat等应用容器
1、将服务端SDK重命名为taobao-sdk-java.jar并放到lib目录下
2、替换DemoController.java文件中变量:
3、运行根目录package.bat文件,或在根目录执行mvn clean package命令,在target目录下生成war包
4、使用应用容器运行war包
private YunosAccountCallapiResponse callApi(String api, String params, String version) throws ApiException {
// 拼装请求参数
YunosAccountCallapiRequest apiRequest = new YunosAccountCallapiRequest();
apiRequest.setApi(api);
apiRequest.setVersion(version);
apiRequest.setTimeStamp(String.valueOf(System.currentTimeMillis() / 1000));
apiRequest.setAuthSign(AUTH_SIGN);
apiRequest.setParams(params);
// 请求API
DefaultTaobaoClient client = new DefaultTaobaoClient(SERVICE_URL, APP_KEY, APP_SECRET);
YunosAccountCallapiResponse apiResponse = client.execute(apiRequest);
return apiResponse;
}
通过应用授权authCode获取应用授权token
|
参数名 |
参数描述 |
入参 |
authCode |
应用授权authCode |
|
clientAppKey |
开放平台颁发的appKey |
|
authSign |
您的APP的签名文件的MD5值 |
出参 |
authToken |
应用授权token |
|
uid |
用户唯一ID |
|
userInfo |
账号其他信息(displayName等) |
错误码 |
错误信息 |
含义 |
50001 |
SYS_INVALID_PARAMS |
参数错误 |
50005 |
AUTH_SIGN_ERROR |
authSign非法 |
60001 |
APP_NOT_EXIST |
appkey不存在 |
75004 |
OAUTH_CODE_ERROR |
验证authcode失败 |
86004 |
INVALID_APP_KEY |
生成authCode时的appkey与本次请求不一致 |
80014 |
GET_TOKEN_BY_AUTHCODE_ERROR |
生成authToken失败 |
500 |
SYS_ERROR |
系统异常 |
通过accessToken获取用户信息
|
参数名 |
参数描述 |
入参 |
accessToken |
YunOS token |
出参 |
displayName |
用户名 |
|
userId |
用户唯一ID |
错误码 |
错误信息 |
含义 |
50001 |
SYS_INVALID_PARAMS |
参数错误 |
75001 |
ACCESS_TOKEN_ERROR |
无效的token |
500 |
SYS_ERROR |
系统异常 |
通过refreshToken刷新accessToken
|
参数名 |
参数描述 |
入参 |
refreshToken |
用于刷新accessToken的refreshToken |
出参 |
accessToken |
YunOS token |
|
expireIn |
accessToken有效时间,默认为7天 |
|
refreshToken |
刷新accessToken用的token,accessToken失效后可用来刷新accessToken |
|
reExpireIn |
refreshToken有效时间,默认为90天 |
|
displayName |
用户名 |
|
userId |
用户唯一ID |
错误码 |
错误信息 |
含义 |
50001 |
SYS_INVALID_PARAMS |
参数错误 |
75006 |
INVALIDATE_TOKEN_ERROR |
refreshToken格式错误 |
75001 |
ACCESS_TOKEN_ERROR |
refreshToken未找到 |
75002 |
REFRESH_TOKEN_ERROR |
刷新accessToken失败 |
75007 |
YUNOS_TOKEN_SERVER_ERROR |
刷新accessToken失败 |
500 |
SYS_ERROR |
系统异常 |
通过应用授权token获取uid和用户信息
|
参数名 |
参数描述 |
入参 |
authToken |
应用授权token |
|
clientAppKey |
开放平台颁发的appKey |
|
authSign |
您的APP的签名文件的MD5值 |
出参 |
uid |
用户唯一ID |
|
userInfo |
账号其他信息(displayName等) |
错误码 |
错误信息 |
含义 |
50001 |
SYS_INVALID_PARAMS |
参数错误 |
50005 |
AUTH_SIGN_ERROR |
authSign非法 |
60001 |
APP_NOT_EXIST |
appkey不存在 |
75004 |
OAUTH_CODE_ERROR |
验证authcode失败 |
86005 |
AUTH_TOKEN_ERROR |
authToken非法 |
86006 |
AUTH_TOKEN_APPKEY_NOT_EQUAL |
appKey与请求生成的authToken时不一致 |
86009 |
AUTH_TOKEN_NOT_EXIST |
authToken不存在或已过期,此时客户端需要清掉保存的token,重新走授权 |
500 |
SYS_ERROR |
系统异常 |
通过设备硬件信息产生YunID,表示匿名用户ID(预留接口,暂时返回null)
|
参数名 |
参数描述 |
入参 |
clientAppKey |
开放平台颁发的appKey |
|
authSign |
您的APP的签名文件的MD5值 |
出参 |
yunId |
匿名用户ID |
错误码 |
错误信息 |
含义 |
50001 |
SYS_INVALID_PARAMS |
参数错误 |
60001 |
APP_NOT_EXIST |
appkey不存在 |
86007 |
GET_YUN_ID_ERROR |
生成YunID失败 |
500 |
SYS_ERROR |
系统异常 |