用户体验:在程序中用户就是一个标识.
获取标识的唯一手段就是登陆注册.
,MOB第三方登录:www.mob.com
没有登陆的话可以使用手机唯一标识码. -- 亦可以登陆保存数据.
登陆成功之后会返回到之前的页面.
①.登陆跟很多页面产生关联.
②.登录场景.
社会工程学、账户安全问题.
用户名、密码 ---- Server ---- 返回一个用户标识. (别人可能会通过Fiddler等抓包工具获取到你的个人信息【不安全】)
- 协议加密:①. Https://````` SSL/TLS
-
- ②.对用户密码进行加密 -- 当然只要有加密,就有解密.
- MD5的方式:
- MD5序列化的算法(并不算是加密):https://www.cmd5.com/hash.aspx ,但是MD5并不可逆.
- 服务器数据库保存的是 用户名和密码(MD5包装后)的.
- MD5序列化的算法(并不算是加密):https://www.cmd5.com/hash.aspx ,但是MD5并不可逆.
- 密码加密的方式:
- 对称加密:
- 密码 --(密钥)-- 密文 【一把密钥】
- 非对称加密:
- 密码 --(密钥)-- 密文 【一对密钥】{公钥;私钥}
- 对称加密:
- MD5的方式:
- ②.对用户密码进行加密 -- 当然只要有加密,就有解密.
-
- 自动登录/加密的一些常用手段:
- SP中放id
- 缺点:太基础的、不安全
- Cookie.
- 缺点:不好管理
- token.
-
④.持久化Cookie+token【目前使用最多】:不做登录,只是请求服务端返回.
-
⑤.单点/多点
-
单设备/多设备
-
- SP中放id
- ⑥.同步
- 物理刪除:直接刪除.
- 逻辑删除:并不是真的删除.
- 好处:对用户信息进行抓取做分析,说白了就是偷取信息.
- 根据上传时间做逻辑判断.
友盟第三方:https://www.umeng.com
腾讯第三方注册:http://open.qq.com/reg
http://www.xieast.com/api/user/login.php?username=13800138000&password=123456
【第二周周考】Android电商项目实战:
1. MVP架构的实现;
2. SharedPreferences保存数据;
3. 轮播图效果的实现
4. 自定义View或Shape图实现圆角搜索框
5. OKHttp或Retrofit网络请求框架完成数据请求
6. Z-xing二维码扫描;
- 友盟第三方登录集成:
- 创建项目
-
首先SDK下载
点击设置,只选精简qq,下载SDK
-
下载完成有三个文件夹,点开(前两个)一个一个粘贴导Jar包即可,一共有5个.
-
怎么获取AppKey?
-
粘代码!!!
-
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); }
配置Android Manifest XML sdk中需要的Activity <activity android:name="com.tencent.tauth.AuthActivity" android:launchMode="singleTask" android:noHistory="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="tencent100424468" /> </intent-filter> </activity> <activity android:name="com.tencent.connect.common.AssistActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
-
-
// 添加权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
// 初始化配置,在Application中配置 public class BaseApplication extends Application { @Override public void onCreate() { super.onCreate(); UMConfigure.init(this, "5a12384aa40fa3551f0001d1" // 只写QQZone即可 , "umeng", UMConfigure.DEVICE_TYPE_PHONE, "");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0 PlatformConfig.setWeixin("wxdc1e388c3822c80b", "3baf1193c85774b3fd9d18447d76cab0"); //豆瓣RENREN平台目前只能在服务器端配置 PlatformConfig.setSinaWeibo("3921700954", "04b48b094faeb16683c32669824ebdad","http://sns.whalecloud.com"); PlatformConfig.setYixin("yxc0614e80c9304c11b0391514d09f13bf"); PlatformConfig.setQQZone("100424468", "5bcda547f1f5565c8e0001c2"); // 这里是我们自己申请的Appkey,每次都要重新申请 PlatformConfig.setTwitter("3aIN7fuF685MuZ7jtXkQxalyi", "MK6FEYG63eWcpDFgRYw4w9puJhzDl0tyuqWjZ3M7XJuuG7mMbO"); PlatformConfig.setAlipay("2015111700822536"); PlatformConfig.setLaiwang("laiwangd497e70d4", "d497e70d4c3e4efeab1381476bac4c5e"); PlatformConfig.setPinterest("1439206"); PlatformConfig.setKakao("e4f60e065048eb031e235c806b31c70f"); PlatformConfig.setDing("dingoalmlnohc0wggfedpk"); PlatformConfig.setVKontakte("5764965","5My6SNliAaLxEm3Lyd9J"); PlatformConfig.setDropbox("oz8v5apet3arcdy","h7p2pjbzkkxt02a"); } }
UMAuthListener authListener = new UMAuthListener() { /** * @desc 授权开始的回调 * @param platform 平台名称 */ @Override public void onStart(SHARE_MEDIA platform) { } /** * @desc 授权成功的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 * @param data 用户资料返回 */ @Override public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) { Toast.makeText(mContext, "成功了", Toast.LENGTH_LONG).show(); } /** * @desc 授权失败的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 * @param t 错误原因 */ @Override public void onError(SHARE_MEDIA platform, int action, Throwable t) { Toast.makeText(mContext, "失败:" + t.getMessage(), Toast.LENGTH_LONG).show(); } /** * @desc 授权取消的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 */ @Override public void onCancel(SHARE_MEDIA platform, int action) { Toast.makeText(mContext, "取消了", Toast.LENGTH_LONG).show(); } };
// 获取用户资料可以使用如下接口:mShareAPI.getPlatformInfo(UserinfoActivity.this, SHARE_MEDIA.SINA, umAuthListener); UMShareAPI.get(MainActivity.this).getPlatformInfo(MainActivity.this, SHARE_MEDIA.QQ, authListener);
写两个控件展示用户头像和昵称
-
- 在授权成功的方法里面 获取数据 并且设置数据
-
/** * @desc 授权成功的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 * @param data 用户资料返回 */ @Override public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) { Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_LONG).show(); String name = data.put("name", "name"); String iconurl = data.put("iconurl", "iconurl"); // 注意这里要使用put txtName.setText(name); Picasso.with(MainActivity.this).load(iconurl).into(imgLogo); // Picasso加载图片框架 }