ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
TMBOY
Date:
Tue Jul 18 16:34:48 2017 +0800
Revision:
45:2aa9f933c8d2
?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TMBOY 45:2aa9f933c8d2 1 /*
TMBOY 45:2aa9f933c8d2 2 * Copyright (c) 2017 Baidu, Inc. All Rights Reserved.
TMBOY 45:2aa9f933c8d2 3 *
TMBOY 45:2aa9f933c8d2 4 * Licensed under the Apache License, Version 2.0 (the "License");
TMBOY 45:2aa9f933c8d2 5 * you may not use this file except in compliance with the License.
TMBOY 45:2aa9f933c8d2 6 * You may obtain a copy of the License at
TMBOY 45:2aa9f933c8d2 7 *
TMBOY 45:2aa9f933c8d2 8 * http://www.apache.org/licenses/LICENSE-2.0
TMBOY 45:2aa9f933c8d2 9 *
TMBOY 45:2aa9f933c8d2 10 * Unless required by applicable law or agreed to in writing, software
TMBOY 45:2aa9f933c8d2 11 * distributed under the License is distributed on an "AS IS" BASIS,
TMBOY 45:2aa9f933c8d2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
TMBOY 45:2aa9f933c8d2 13 * See the License for the specific language governing permissions and
TMBOY 45:2aa9f933c8d2 14 * limitations under the License.
TMBOY 45:2aa9f933c8d2 15 */
TMBOY 45:2aa9f933c8d2 16 package com.baidu.duer.dcs.oauth.api;
TMBOY 45:2aa9f933c8d2 17
TMBOY 45:2aa9f933c8d2 18 import android.Manifest;
TMBOY 45:2aa9f933c8d2 19 import android.app.Activity;
TMBOY 45:2aa9f933c8d2 20 import android.content.Context;
TMBOY 45:2aa9f933c8d2 21 import android.content.pm.PackageManager;
TMBOY 45:2aa9f933c8d2 22 import android.os.Bundle;
TMBOY 45:2aa9f933c8d2 23 import android.os.Parcel;
TMBOY 45:2aa9f933c8d2 24 import android.os.Parcelable;
TMBOY 45:2aa9f933c8d2 25 import android.text.TextUtils;
TMBOY 45:2aa9f933c8d2 26 import android.util.Log;
TMBOY 45:2aa9f933c8d2 27 import android.webkit.CookieSyncManager;
TMBOY 45:2aa9f933c8d2 28
TMBOY 45:2aa9f933c8d2 29 import com.baidu.duer.dcs.oauth.api.BaiduDialog.BaiduDialogListener;
TMBOY 45:2aa9f933c8d2 30 import com.baidu.duer.dcs.util.CommonUtil;
TMBOY 45:2aa9f933c8d2 31 import com.baidu.duer.dcs.util.LogUtil;
TMBOY 45:2aa9f933c8d2 32
TMBOY 45:2aa9f933c8d2 33 /**
TMBOY 45:2aa9f933c8d2 34 * 封装了oauth2授权,我们采用的是百度Oauth的implicit grant的方式
TMBOY 45:2aa9f933c8d2 35 * 该方式的地址:http://developer.baidu.com/wiki/index.php?title=docs/oauth/implicit
TMBOY 45:2aa9f933c8d2 36 * <p>
TMBOY 45:2aa9f933c8d2 37 * Created by zhangyan42@baidu.com on 2017/5/24.
TMBOY 45:2aa9f933c8d2 38 * TODO: 百度Oauth2授权方式完善
TMBOY 45:2aa9f933c8d2 39 */
TMBOY 45:2aa9f933c8d2 40 public class BaiduOauthImplicitGrant implements Parcelable {
TMBOY 45:2aa9f933c8d2 41 private static final String LOG_TAG = "BaiduOauth";
TMBOY 45:2aa9f933c8d2 42 public static final String CANCEL_URI = "bdconnect://cancel";
TMBOY 45:2aa9f933c8d2 43 // 百度Oauth授权回调需要在DUEROS开放平台的控制平台
TMBOY 45:2aa9f933c8d2 44 // 应用编辑-->>OAUTH CONFIG URL的链接地址-->>授权回调页-->>安全设置-->>授权回调页
TMBOY 45:2aa9f933c8d2 45 // 需要注意
TMBOY 45:2aa9f933c8d2 46 public static final String SUCCESS_URI = "bdconnect://success";
TMBOY 45:2aa9f933c8d2 47 private static final String OAUTHORIZE_URL = "https://openapi.baidu.com/oauth/2.0/authorize";
TMBOY 45:2aa9f933c8d2 48 private static final String DISPLAY_STRING = "mobile";
TMBOY 45:2aa9f933c8d2 49 private static final String[] DEFAULT_PERMISSIONS = {"basic"};
TMBOY 45:2aa9f933c8d2 50 private static final String KEY_CLIENT_ID = "clientId";
TMBOY 45:2aa9f933c8d2 51 // 应用注册的api key信息
TMBOY 45:2aa9f933c8d2 52 private String cliendId;
TMBOY 45:2aa9f933c8d2 53 private AccessTokenManager accessTokenManager;
TMBOY 45:2aa9f933c8d2 54
TMBOY 45:2aa9f933c8d2 55 /**
TMBOY 45:2aa9f933c8d2 56 * 使用应用的基本信息构建Baidu对象
TMBOY 45:2aa9f933c8d2 57 *
TMBOY 45:2aa9f933c8d2 58 * @param clientId 应用注册的api key信息
TMBOY 45:2aa9f933c8d2 59 * @param context 当前应用的上下文环境
TMBOY 45:2aa9f933c8d2 60 */
TMBOY 45:2aa9f933c8d2 61 public BaiduOauthImplicitGrant(String clientId, Context context) {
TMBOY 45:2aa9f933c8d2 62 if (clientId == null) {
TMBOY 45:2aa9f933c8d2 63 throw new IllegalArgumentException("apiKey信息必须提供!");
TMBOY 45:2aa9f933c8d2 64 }
TMBOY 45:2aa9f933c8d2 65 this.cliendId = clientId;
TMBOY 45:2aa9f933c8d2 66 init(context);
TMBOY 45:2aa9f933c8d2 67 }
TMBOY 45:2aa9f933c8d2 68
TMBOY 45:2aa9f933c8d2 69 /**
TMBOY 45:2aa9f933c8d2 70 * 使用Parcel流构建Baidu对象
TMBOY 45:2aa9f933c8d2 71 *
TMBOY 45:2aa9f933c8d2 72 * @param in Parcel流信息
TMBOY 45:2aa9f933c8d2 73 */
TMBOY 45:2aa9f933c8d2 74 public BaiduOauthImplicitGrant(Parcel in) {
TMBOY 45:2aa9f933c8d2 75 Bundle bundle = Bundle.CREATOR.createFromParcel(in);
TMBOY 45:2aa9f933c8d2 76 this.cliendId = bundle.getString(KEY_CLIENT_ID);
TMBOY 45:2aa9f933c8d2 77 this.accessTokenManager = AccessTokenManager.CREATOR.createFromParcel(in);
TMBOY 45:2aa9f933c8d2 78 }
TMBOY 45:2aa9f933c8d2 79
TMBOY 45:2aa9f933c8d2 80 /**
TMBOY 45:2aa9f933c8d2 81 * 初始化accesTokenManager等信息
TMBOY 45:2aa9f933c8d2 82 *
TMBOY 45:2aa9f933c8d2 83 * @param context 当前执行的上下文环境
TMBOY 45:2aa9f933c8d2 84 */
TMBOY 45:2aa9f933c8d2 85 public void init(Context context) {
TMBOY 45:2aa9f933c8d2 86 if (context.checkCallingOrSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE)
TMBOY 45:2aa9f933c8d2 87 != PackageManager.PERMISSION_GRANTED) {
TMBOY 45:2aa9f933c8d2 88 Log.w(LOG_TAG, "App miss permission android.permission.ACCESS_NETWORK_STATE! "
TMBOY 45:2aa9f933c8d2 89 + "Some mobile's WebView don't display page!");
TMBOY 45:2aa9f933c8d2 90 }
TMBOY 45:2aa9f933c8d2 91 this.accessTokenManager = new AccessTokenManager(context);
TMBOY 45:2aa9f933c8d2 92 this.accessTokenManager.initToken();
TMBOY 45:2aa9f933c8d2 93 }
TMBOY 45:2aa9f933c8d2 94
TMBOY 45:2aa9f933c8d2 95 /**
TMBOY 45:2aa9f933c8d2 96 * 完成登录并获取token信息(User-Agent Flow),该方法使用默认的用户权限
TMBOY 45:2aa9f933c8d2 97 *
TMBOY 45:2aa9f933c8d2 98 * @param activity 需要展示Dialog UI的Activity
TMBOY 45:2aa9f933c8d2 99 * @param isForceLogin 是否强制登录,如果该参数为true的话,会强制用户进行登录。
TMBOY 45:2aa9f933c8d2 100 * @param isConfirmLogin 是否确认登录,如果该参数为true的话,如果用户当前为登录状态,
TMBOY 45:2aa9f933c8d2 101 * 则会显示用户的登录头像,点击头像后完成登录操作
TMBOY 45:2aa9f933c8d2 102 * @param listener Dialog回调接口如Activity跳转
TMBOY 45:2aa9f933c8d2 103 */
TMBOY 45:2aa9f933c8d2 104 public void authorize(Activity activity,
TMBOY 45:2aa9f933c8d2 105 boolean isForceLogin,
TMBOY 45:2aa9f933c8d2 106 boolean isConfirmLogin,
TMBOY 45:2aa9f933c8d2 107 final BaiduDialogListener listener) {
TMBOY 45:2aa9f933c8d2 108 this.authorize(activity, null, isForceLogin, isConfirmLogin, listener);
TMBOY 45:2aa9f933c8d2 109 }
TMBOY 45:2aa9f933c8d2 110
TMBOY 45:2aa9f933c8d2 111 /**
TMBOY 45:2aa9f933c8d2 112 * 根据相应的permissions信息,完成登录并获取token信息(User-Agent Flow)
TMBOY 45:2aa9f933c8d2 113 *
TMBOY 45:2aa9f933c8d2 114 * @param activity 需要展示Dialog UI的Activity
TMBOY 45:2aa9f933c8d2 115 * @param permissions 需要获得的授权权限信息
TMBOY 45:2aa9f933c8d2 116 * @param isForceLogin 是否强制登录,如果该参数为true的话,会强制用户进行登录。
TMBOY 45:2aa9f933c8d2 117 * @param listener 回调的listener接口,如Activity跳转等
TMBOY 45:2aa9f933c8d2 118 */
TMBOY 45:2aa9f933c8d2 119 private void authorize(Activity activity,
TMBOY 45:2aa9f933c8d2 120 String[] permissions,
TMBOY 45:2aa9f933c8d2 121 boolean isForceLogin,
TMBOY 45:2aa9f933c8d2 122 boolean isConfirmLogin,
TMBOY 45:2aa9f933c8d2 123 final BaiduDialogListener listener) {
TMBOY 45:2aa9f933c8d2 124 if (this.isSessionValid()) {
TMBOY 45:2aa9f933c8d2 125 listener.onComplete(new Bundle());
TMBOY 45:2aa9f933c8d2 126 return;
TMBOY 45:2aa9f933c8d2 127 }
TMBOY 45:2aa9f933c8d2 128
TMBOY 45:2aa9f933c8d2 129 // 使用匿名的BaiduDialogListener对listener进行了包装,并进行一些存储token信息和当前登录用户的逻辑,
TMBOY 45:2aa9f933c8d2 130 // 外部传进来的listener信息不需要在进行存储相关的逻辑
TMBOY 45:2aa9f933c8d2 131 this.authorize(activity,
TMBOY 45:2aa9f933c8d2 132 permissions,
TMBOY 45:2aa9f933c8d2 133 isForceLogin,
TMBOY 45:2aa9f933c8d2 134 isConfirmLogin,
TMBOY 45:2aa9f933c8d2 135 new BaiduDialogListener() {
TMBOY 45:2aa9f933c8d2 136 @Override
TMBOY 45:2aa9f933c8d2 137 public void onError(BaiduDialogError e) {
TMBOY 45:2aa9f933c8d2 138 LogUtil.d(LOG_TAG, "DialogError " + e);
TMBOY 45:2aa9f933c8d2 139 listener.onError(e);
TMBOY 45:2aa9f933c8d2 140 }
TMBOY 45:2aa9f933c8d2 141
TMBOY 45:2aa9f933c8d2 142 @Override
TMBOY 45:2aa9f933c8d2 143 public void onComplete(Bundle values) {
TMBOY 45:2aa9f933c8d2 144 // 存储相应的token信息
TMBOY 45:2aa9f933c8d2 145 getAccessTokenManager().storeToken(values);
TMBOY 45:2aa9f933c8d2 146 // 完成授权操作,使用listener进行回调,eg。跳转到其他的activity
TMBOY 45:2aa9f933c8d2 147 listener.onComplete(values);
TMBOY 45:2aa9f933c8d2 148 }
TMBOY 45:2aa9f933c8d2 149
TMBOY 45:2aa9f933c8d2 150 @Override
TMBOY 45:2aa9f933c8d2 151 public void onCancel() {
TMBOY 45:2aa9f933c8d2 152 LogUtil.d(LOG_TAG, "login cancel");
TMBOY 45:2aa9f933c8d2 153 listener.onCancel();
TMBOY 45:2aa9f933c8d2 154 }
TMBOY 45:2aa9f933c8d2 155
TMBOY 45:2aa9f933c8d2 156 @Override
TMBOY 45:2aa9f933c8d2 157 public void onBaiduException(BaiduException e) {
TMBOY 45:2aa9f933c8d2 158 Log.d(LOG_TAG, "BaiduException : " + e);
TMBOY 45:2aa9f933c8d2 159 listener.onBaiduException(e);
TMBOY 45:2aa9f933c8d2 160 }
TMBOY 45:2aa9f933c8d2 161 }, SUCCESS_URI, "token");
TMBOY 45:2aa9f933c8d2 162 }
TMBOY 45:2aa9f933c8d2 163
TMBOY 45:2aa9f933c8d2 164 /**
TMBOY 45:2aa9f933c8d2 165 * 通过Dialog UI展示用户登录、授权页
TMBOY 45:2aa9f933c8d2 166 *
TMBOY 45:2aa9f933c8d2 167 * @param activity 需要展示Dialog UI的Activity
TMBOY 45:2aa9f933c8d2 168 * @param permissions 需要请求的环境
TMBOY 45:2aa9f933c8d2 169 * @param listener 用于回调的listener接口方法
TMBOY 45:2aa9f933c8d2 170 * @param redirectUrl 回调地址
TMBOY 45:2aa9f933c8d2 171 * @param responseType 授权请求的类型
TMBOY 45:2aa9f933c8d2 172 */
TMBOY 45:2aa9f933c8d2 173 private void authorize(Activity activity,
TMBOY 45:2aa9f933c8d2 174 String[] permissions,
TMBOY 45:2aa9f933c8d2 175 boolean isForceLogin,
TMBOY 45:2aa9f933c8d2 176 boolean isConfirmLogin,
TMBOY 45:2aa9f933c8d2 177 final BaiduDialogListener listener,
TMBOY 45:2aa9f933c8d2 178 String redirectUrl, String responseType) {
TMBOY 45:2aa9f933c8d2 179 CookieSyncManager.createInstance(activity);
TMBOY 45:2aa9f933c8d2 180 Bundle params = new Bundle();
TMBOY 45:2aa9f933c8d2 181 params.putString("client_id", this.cliendId);
TMBOY 45:2aa9f933c8d2 182 params.putString("redirect_uri", redirectUrl);
TMBOY 45:2aa9f933c8d2 183 params.putString("response_type", responseType);
TMBOY 45:2aa9f933c8d2 184 params.putString("display", DISPLAY_STRING);
TMBOY 45:2aa9f933c8d2 185 if (isForceLogin) {
TMBOY 45:2aa9f933c8d2 186 params.putString("force_login", "1");
TMBOY 45:2aa9f933c8d2 187 }
TMBOY 45:2aa9f933c8d2 188 if (isConfirmLogin) {
TMBOY 45:2aa9f933c8d2 189 params.putString("confirm_login", "1");
TMBOY 45:2aa9f933c8d2 190 }
TMBOY 45:2aa9f933c8d2 191 if (permissions == null) {
TMBOY 45:2aa9f933c8d2 192 permissions = DEFAULT_PERMISSIONS;
TMBOY 45:2aa9f933c8d2 193 }
TMBOY 45:2aa9f933c8d2 194 if (permissions != null && permissions.length > 0) {
TMBOY 45:2aa9f933c8d2 195 String scope = TextUtils.join(" ", permissions);
TMBOY 45:2aa9f933c8d2 196 params.putString("scope", scope);
TMBOY 45:2aa9f933c8d2 197 }
TMBOY 45:2aa9f933c8d2 198 String url = OAUTHORIZE_URL + "?" + CommonUtil.encodeUrl(params);
TMBOY 45:2aa9f933c8d2 199 LogUtil.d(LOG_TAG, "url:" + url);
TMBOY 45:2aa9f933c8d2 200 if (activity.checkCallingOrSelfPermission(Manifest.permission.INTERNET)
TMBOY 45:2aa9f933c8d2 201 != PackageManager.PERMISSION_GRANTED) {
TMBOY 45:2aa9f933c8d2 202 CommonUtil.showAlert(activity, "没有权限", "应用需要访问互联网的权限");
TMBOY 45:2aa9f933c8d2 203 } else {
TMBOY 45:2aa9f933c8d2 204 new BaiduDialog(activity, url, listener).show();
TMBOY 45:2aa9f933c8d2 205 }
TMBOY 45:2aa9f933c8d2 206 }
TMBOY 45:2aa9f933c8d2 207
TMBOY 45:2aa9f933c8d2 208 /**
TMBOY 45:2aa9f933c8d2 209 * 将清除存储的token信息
TMBOY 45:2aa9f933c8d2 210 */
TMBOY 45:2aa9f933c8d2 211 public void clearAccessToken() {
TMBOY 45:2aa9f933c8d2 212 if (this.accessTokenManager != null) {
TMBOY 45:2aa9f933c8d2 213 this.accessTokenManager.clearToken();
TMBOY 45:2aa9f933c8d2 214 this.accessTokenManager = null;
TMBOY 45:2aa9f933c8d2 215 }
TMBOY 45:2aa9f933c8d2 216 }
TMBOY 45:2aa9f933c8d2 217
TMBOY 45:2aa9f933c8d2 218 /**
TMBOY 45:2aa9f933c8d2 219 * 判断token信息是否有效。
TMBOY 45:2aa9f933c8d2 220 *
TMBOY 45:2aa9f933c8d2 221 * @return boolean true/false
TMBOY 45:2aa9f933c8d2 222 */
TMBOY 45:2aa9f933c8d2 223 public boolean isSessionValid() {
TMBOY 45:2aa9f933c8d2 224 return this.accessTokenManager.isSessionValid();
TMBOY 45:2aa9f933c8d2 225 }
TMBOY 45:2aa9f933c8d2 226
TMBOY 45:2aa9f933c8d2 227 /**
TMBOY 45:2aa9f933c8d2 228 * 获取AccessTokenManager对象
TMBOY 45:2aa9f933c8d2 229 *
TMBOY 45:2aa9f933c8d2 230 * @return accessTokenManager对象
TMBOY 45:2aa9f933c8d2 231 */
TMBOY 45:2aa9f933c8d2 232 public AccessTokenManager getAccessTokenManager() {
TMBOY 45:2aa9f933c8d2 233 return this.accessTokenManager;
TMBOY 45:2aa9f933c8d2 234 }
TMBOY 45:2aa9f933c8d2 235
TMBOY 45:2aa9f933c8d2 236 /**
TMBOY 45:2aa9f933c8d2 237 * 获取AccessToken信息
TMBOY 45:2aa9f933c8d2 238 *
TMBOY 45:2aa9f933c8d2 239 * @return accessToken信息
TMBOY 45:2aa9f933c8d2 240 */
TMBOY 45:2aa9f933c8d2 241 public String getAccessToken() {
TMBOY 45:2aa9f933c8d2 242 return this.accessTokenManager.getAccessToken();
TMBOY 45:2aa9f933c8d2 243 }
TMBOY 45:2aa9f933c8d2 244
TMBOY 45:2aa9f933c8d2 245 /*
TMBOY 45:2aa9f933c8d2 246 * (non-Javadoc)
TMBOY 45:2aa9f933c8d2 247 *
TMBOY 45:2aa9f933c8d2 248 * @see android.os.Parcelable#describeContents()
TMBOY 45:2aa9f933c8d2 249 */
TMBOY 45:2aa9f933c8d2 250 @Override
TMBOY 45:2aa9f933c8d2 251 public int describeContents() {
TMBOY 45:2aa9f933c8d2 252 return 0;
TMBOY 45:2aa9f933c8d2 253 }
TMBOY 45:2aa9f933c8d2 254
TMBOY 45:2aa9f933c8d2 255 /*
TMBOY 45:2aa9f933c8d2 256 * (non-Javadoc)
TMBOY 45:2aa9f933c8d2 257 *
TMBOY 45:2aa9f933c8d2 258 * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
TMBOY 45:2aa9f933c8d2 259 */
TMBOY 45:2aa9f933c8d2 260 @Override
TMBOY 45:2aa9f933c8d2 261 public void writeToParcel(Parcel dest, int flags) {
TMBOY 45:2aa9f933c8d2 262 Bundle bundle = new Bundle();
TMBOY 45:2aa9f933c8d2 263 bundle.putString(KEY_CLIENT_ID, this.cliendId);
TMBOY 45:2aa9f933c8d2 264 bundle.writeToParcel(dest, flags);
TMBOY 45:2aa9f933c8d2 265 this.accessTokenManager.writeToParcel(dest, flags);
TMBOY 45:2aa9f933c8d2 266 }
TMBOY 45:2aa9f933c8d2 267
TMBOY 45:2aa9f933c8d2 268 public static final Creator<BaiduOauthImplicitGrant> CREATOR = new Creator<BaiduOauthImplicitGrant>() {
TMBOY 45:2aa9f933c8d2 269 public BaiduOauthImplicitGrant createFromParcel(Parcel in) {
TMBOY 45:2aa9f933c8d2 270 return new BaiduOauthImplicitGrant(in);
TMBOY 45:2aa9f933c8d2 271 }
TMBOY 45:2aa9f933c8d2 272
TMBOY 45:2aa9f933c8d2 273 public BaiduOauthImplicitGrant[] newArray(int size) {
TMBOY 45:2aa9f933c8d2 274 return new BaiduOauthImplicitGrant[size];
TMBOY 45:2aa9f933c8d2 275 }
TMBOY 45:2aa9f933c8d2 276 };
TMBOY 45:2aa9f933c8d2 277 }