怎么用QQ帐号伸请小米手机游戏帐号帐号?

后使用快捷导航没有帐号?
查看: 852|回复: 20
QQ邮箱注册的,小米手机账户,QQ账户如何合并使用?
软盘, 积分 8, 距离下一级还需 92 积分
软盘, 积分 8, 距离下一级还需 92 积分
在线时间0 小时
早期的快盘是不支持第三方登录的,所以用了QQ邮箱注册的,后来买了小米手机,小米手机上的也是金山的云服务,QQ邮箱是最早注册的,里面有许多文件是我需要的,QQ账号登录是最方便的,小米手机上的也要用,所以现在光登录这件事就很麻烦,现在想我想把QQ邮箱注册的和QQ账号的还有小米手机的账号合并,请问有什么办法?
快盘因你而精彩!
软盘, 积分 8, 距离下一级还需 92 积分
软盘, 积分 8, 距离下一级还需 92 积分
在线时间0 小时
快盘因你而精彩!
在线时间235 小时
可以参照以下两个步骤
1、QQ登陆---帐号管理--绑定QQ邮箱
2.小米登陆--帐号管理--绑定QQ邮箱,
3个帐号完美合并
快盘因你而精彩!
心有猛虎 细嗅蔷薇
心有猛虎 细嗅蔷薇
在线时间2043 小时
在线时间792 小时
但文件不能合并~!
快盘因你而精彩!
在线时间2209 小时
快盘默认账户是邮箱,新浪微博、QQ、小米账号属于第三方登录,一个临时的登陆账号,权宜之计,建议您绑定自己常用邮箱,邮箱账号可以畅行任意平台版本!
绑定方法,用QQ(或者小米账号)直接登录,进入“账号设置”,绑定邮箱。
绑定过程中会提示你空间的保留,请注意选择保留最大的空间,合并完成后你的数据也会分文件夹进行合并。
快盘因你而精彩!
软盘, 积分 79, 距离下一级还需 21 积分
软盘, 积分 79, 距离下一级还需 21 积分
在线时间10 小时
我也有类似的问题
快盘因你而精彩!
快盘资深粉丝
快盘资深粉丝
在线时间243 小时
嗯,顺便学习了
快盘因你而精彩!
兴趣爱好打篮球,玩电脑,看电影,听歌
在线时间181 小时
快盘因你而精彩!
DVD刻录机, 积分 1825, 距离下一级还需 1175 积分
DVD刻录机, 积分 1825, 距离下一级还需 1175 积分
在线时间5 小时
沙发!沙发!
快盘因你而精彩!
快盘汉子用户
快盘官方客服砖家
完成邮箱验证任务
快盘论坛超级版主
精华帖数 ≥10
快盘论坛版主
互助解答团队
快盘铁杆粉丝
快盘铁杆粉丝
• • • • • • 
最快最安全的免费网盘账号接入服务
如果您在集成过程中遇到任何问题,都可以添加QQ群: ,群中会有工程师解答您的问题。
快速说明:
先注册个用户
对应的appid
这两个对应了oauth的 appid和appkey
这些权限有的木有申请你是无法获得的 比如/user/relation就需要获得您米聊中的好友信息这个权限
在修改回调地址和修改自己的r-url
再强调一下一定要看自己符合哪些权限,否则会权限不够 一切都准备好了,接下来通过mac_key和token来请求了,这个不是很简单的,记住这个不是很简单的,请最好别自己尝试,自己尝试不花几个小时是编不出来的,请用我们的api.如果没有api的语言,注意如果你非常明白啥是oauth可以尝试,其余一定要来联系我们
1.OAuth 2.0概述
小米账号API访问,如获取用户名片、获取米聊好友关系等都需要使用用户身份,目前小米账号开放平台用户身份鉴权使用OAuth 2.0。
关于OAuth 2.0协议授权流程开发者可以先浏览OAuth 2.0的接口文档,熟悉OAuth 2.0的接口及参数的含义,然后我们根据应用场景各自说明如何使用OAuth 2.0。
图 1-1小米帐号授权流程图
相关名词解释:
服务提供方(resource server): 用户使用服务提供方来存储受保护的资源,这里指的是小米公司。
用户(user):存放在服务提供方的受保护的资源的拥有者。
客户端(client):要访问服务提供方资源的第三方应用,通常是网站在认证过程之前,客户端要向服务提供者申请客户端标识。
令牌(token):分发给客户端的代表访问授权的字符串。通常这个字符串对客户端来说是不透明的。令牌代表资源拥有者许可的访问作用域和持续时间,并由资源服务器和授权服务器强制保证。这个令牌可以代表一个标识符,用于检索授权信息,或以一种可验证的方式自包含授权信息(即一个包含数据和签名的令牌字符串)。令牌可能只代表纯粹的访问能力。
访问令牌(access token):客户端用来代表资源拥有者发送验证请求的令牌。 小米API将支持OAuth 2.0中Bearer Token和MAC Token的两种token形式。
刷新令牌(refresh token):客户端用来获取新的访问令牌的令牌,而不用资源拥有者的参与。
授权码(code):一个短期令牌,代表终端用户的授权。授权码用于获取一个访问令牌和一个刷新令牌。
客户端标识符(client id):分发给客户端的唯一标识,用于客户端向授权服务器标识自己。客户端标识符可以有一个对应的密钥。
2.授权接口说明
2.1授权流程说明
2.1.1授权码方式授权流程
授权码方式(authorization code)获取访问令牌(access token)的授权验证流程又被称为web server flow,适用于所有有服务端的应用,如Web/Wap站点、有服务端的手机/桌面客户端应用等。
图 2-1授权码方式授权流程
2.1.2 Implicit Grant方式授权流程
Implicit Grant方式获取访问令牌(access token)的授权验证流程又被称为User-Agent Flow,适用于所有无服务端配合的应用(由于应用往往位于一个User Agent里,如浏览器里面,因此这类应用在某些平台下又被称为Client-Side Application),如手机/桌面客户端程序、浏览器插件等,以及基于JavaScript等脚本客户端脚本语言实现的应用,他们的一个共同特点是,应用无法妥善保管其应用密钥(App Secret Key)。
图 2-3 Implicit Grant流程授权流程
2.2授权接口说明
2.2.1请求用户授权接口
URL: /oauth2/authorize
HTTP请求方: GET
表 2-1 请求用户授权参数表
申请应用时分配的App Id。
redirect_uri
授权回调地址,必须和申请应用是填写的一致。
response_type
描述获取授权的方式,目前只支持code 和 token,Code 对应 Authorization Code Flow, token对应Implicit Flow。
申请scope权限所需参数,可一次申请多个scope权限,用空格分隔。
用于保持请求和回调的状态,在回调时,会在Query Parameter中回传该参数。开发者可以用这个参数验证请求有效性,也可以记录用户请求授权页前的位置。
skip_confirm
是否跳过帐号确认过程,黄页接入请设置为true(skip_confirm=true)
接口返回值
请求授权接口会将结果作为redirect_uri的参数返回给第三方调用者,response_type不同返回的参数也不同,区别如下:
response_type为code(Authorization Code Flow)时接口返回值如表2-2所述。
表 2-2 请求用户授权返回值表(response_type为code)
用于调用access_token,接口获取授权后的access token。
如果请求时传递参数,会回传该参数。
response_type为token(Implicit Grant Flow)接口返回值如表2-3所述。
表 2-3请求用户授权返回值表(response_type为token)
access_token
取授权后的access token。
expires_in
Access Token的有效期,以秒为单位
Access Token最终的访问范围
如果请求时传递参数,会回传该参数。
token_type
说明返回的token类型,目前是mac
mac_algorithm
mac计算的算法名称
表 2-4请求用户授权错误类型表
OAuth定义的错误码。
error_description
对error的简单描述。
/oauth2/authorize?client_id=ID&redirect_uri=&response_type=code
/oauth2/authorize?client_id=ID&redirect_uri=&response_type=token
?code=exapmle_code
2.2.2 获取访问令牌接口
URL : /oauth2/token
HTTP请求方式: GET
表 2-5获取访问令牌参数表
申请应用时分配的App Id。
redirect_uri
授权回调地址,必须和申请应用是填写的一致。
client_secret
申请应用时分配的App Secret
grant_type
此值为authorization_code 或者 refresh_token
refresh_token
当grant_type为refresh_token时,必须传该参数,置为上次下发的refresh token值
当grant_type为authorization_code时,必须传该参数,置为上次下发的code值
token_type
说明返回的token类型,目前是mac
接口返回值
接口返回值是一个Json格式字符串,具体说明如下:
第三方获取访问令牌验证通过,该接口返回Access Token相关的信息:
&access_token&: &access token value&,
&expires_in&: 360000,
&refresh_token&: &refresh token value&,
&scope&: &scope value&,
&token_type &: &mac&,
&mac_key &: &mac key value&,
&mac_algorithm&: & HmacSha1&
&openId&=&2.0XXXXXXXXX&
字段说明:
1) access_token:获取的Access Token;
2) expires_in:Access Token的有效期,以秒为单位;
3) refresh_token:用于刷新Access Token ,有效时间为10年;
4) scope:Access Token最终的访问范围,既用户实际授予的权限列表;
5) token_type: access token的类型,type值为mac;
6) mac_key: MAC加密算法对请求进行加密时的密钥;
7) mac_algorithm:MAC加密的算法,目前只支持HmacSha1
8) openId: 是v2版本所提供的一种唯一标识
如果应用验证过程中出错, OAuth 2.0返回错误信息:
&error&: &error_code&,
&error_ description &: &错误描述 &,
1) error:错误码,是一个int类型的数字;
2) error_description:一段人类可读的文字,用来帮助理解和解决发生的错误;
Grant type为authorization_code请求
/oauth2/token?client_id=ID&redirect_uri=&grant_type=authorization_code&client_secret=SECRET&code=CODE
/oauth2/token?client_id=ID&redirect_uri=&grant_type=refresh_token&client_secret=SECRET&refresh_token=REFRESHTOKEN
3. OAuth 2.0 错误码说明
OAuth 2.0实现中,授权服务器在接收到验证授权请求时,会按照OAuth 2.0协议对本请求的请求参数进行检验,若请求不合法或验证未通过,授权服务器会返回相应的错误信息,包含以下几个参数:
error: 错误码
error_description: 错误的描述信息
错误信息的返回方式有两种:
1). 当请求授权/oauth2/authorize 时出现错误,返回方式是:跳转到redirect_uri,并在uri 的query parameter中附带错误的描述信息。
2). 当请求/oauth2/token 时出现错误,返回方式是JSON文本,例如:
&error&:&errorcode&,
&error_description&:&errorCode描述&
OAuth 2.0错误响应中的错误码定义如表3-1所示:
表 3-1 OAuth 2.0 错误码表
OA_CLIENT_NOT_EXISTS(96001)
client不存在
OA_INVALID_REQUEST(96002)
请求缺少某个必需参数,或者格式不正确
OA_INVALID_CLIENT(96003)
client_id 和client_secret不匹配
OA_INVALID_GRANT(96004)
grant可是无效的
OA_UNAUTHORIZED_CLIENT(96005)
客户端没有权限使用该请求
OA_UNSUPPORTED_GRANT_TYPE(96006)
grant不被授权服务器所支持
OA_INVALID_SCOPE(96007)
scope是无效的、未知的,或格式不正确的
OA_INVALID_TOKEN(96008)
token无效或已经过期
OA_INVALID_REFRESHTOKEN(96009)
refresh token无效或已经过期
OA_INVALID_REDIRECT_URI(96010)
重定向URI与预先注册的值不匹配或者不是一个合法的URI
OA_UNSUPPORTED_RESPONSE_TYPE(96011)
响应类型不为授权服务器所支持
OA_ACCESS_DENIED(96012)
用户或授权服务器拒绝了请求
OA_INVALID_CODE(96013)
授权码无效或已经过期
4.Mac Token使用说明
4.1 Mac Token说明
MacToken是授权小米下发的一种访问令牌类型,使用MacToken调用API时,用MAC加密算法对请求进行加密,并将结果放到http请求的header中。MAC算法有HmacSha1和HmacSha256两种,小米API默认使用HmacSha1。下面给出Java和PHP算法示例:
Java算法示例:
public static byte[] encryptHMACSha1(byte[] data, byte[] key) {
SecretKeySpec signingKey = new SecretKeySpec(key, HMAC_SHA1);
Mac mac = Mac.getInstance(HMAC_SHA1);
mac.init(signingKey);
mac.update(data);
return mac.doFinal();
PHP算法示例:
static public function buildSignature($signString, $secret) {
$sign = base64_encode(hash_hmac('sha1', $signString, $secret, True));
return urlencode($sign);
4.2 使用方法
4.2.1 请求内容标准化
使用Mac Token需要将请求内容按照一定的规则拼接形成符合要求的标准的格式字符串,标准化字符串用于计算请求API的签名值,小米规定的格式请求字符串格式如下(\n代表换行):格式化字符串 = Nonce + \n + HTTP方法 + \n + HOST + \n + URI+ \n + QUERY+\n
由随机数和时间戳组成,格式:随机数:当前分钟数(1970 年 1 月 1 日午夜0点之间的时间差)
78(注意冒号分割)
调用API时请求方式
调用API时的域名
open.(没有http或https)
调用API时的path(必须以/开头)
/user/profile
Key按照字典序排列的query串, 内容为空的去query字段不参与签名
clientId=xxx&token=xxx
具体示例:
请求字符串= 78\nGET\n open.\n/user/profile\n clientId=xxx&token=xxx\n
4.2.2 Mac Token请求格式
采用Mac Token调用API,需要将相关签名信息放入请求的http请求的Header中。第三方在发送API请求时,要对请求进行MAC加密计算,并将结果放到请求Header中的"Authorization"字段中。Authorization字段内容如下:Authorization: MAC access_token="token value",nonce="随机码" ,mac="签名值"
字段含义说明:
access_token : 授权时下发的access_token。
nonce:随机串,由客户端按照2中规则产生的随机字符串包括当前分钟数值。
mac:签名值,根据mac算法计算生成的。Mac = HmacSha1(格式化字符串, mac_key)。
5.小米账号的开放API
5.1获取用户名片
URL: https://open./user/profile
HTTP请求方式:GET
请求参数:
表 5-1 获取用户名片参数表
申请应用时分配的App Id。
用户授权时client得到的token
Header数据:参考第4节中方式生成Header授权信息。
返回数据:
如果访问令牌验证通过,会返回用户相关的信息, 返回格式为Json文本, 格式如下:
&result&: &ok&,
&description&: &成功&,
&miliaoNick&: &米聊昵称&,
&userId&: 米聊号,
&miliaoIcon&: 头像URL
如果访问令牌验证错误,会返回错误信息, 返回格式为Json文本, 格式如下:
&result&: &error&,
&description&: &错误描述&,
&code&: 错误码
5.2获取用户的关系列表
URL:https://open./user/relation
HTTP请求方式:GET
请求参数:
表 5-2 获取用户关系列表参数表
申请应用时分配的App Id。
用户授权时client得到的token
Heaer数据:参考第4节中方式生成Header授权信息。
返回数据:
如果访问令牌验证通过,会返回用户好友列表的信息, 返回格式为Json文本, 格式如下:
&result&: &ok&,
&description&: &成功&,
&friends&: &好友列表&
如果访问令牌验证错误,会返回错误信息, 返回格式为Json文本, 格式如下:
&result&: &error&,
&description&: &错误描述&,
&code&: 错误码
5.3获取用户OpenId
URL:https://open./user/openidV2
HTTP请求方式:GET
请求参数:
表 5-3 获取用户OpenId参数表
申请应用时分配的App Id。
用户授权时client得到的token
Heaer数据:无需签名信息。
返回数据:
如果访问令牌验证通过,会返回用户OpenID相关的信息, 返回格式为Json文本, 格式如下:
&result&: &ok&,
&description&: &成功&,
&openid&: &openid&
如果访问令牌验证错误,会返回错误信息, 返回格式为Json文本, 格式如下:
&result&: &error&,
&description&: &错误描述&,
&code&: 错误码
5.4验证用户密码接口
URL:https://open./checkPassword
HTTP请求方式:GET
请求参数:
表 5.4 验证用户密码接口参数表
申请应用时分配的App Id。
通过5.1接口获取到的userId
完整的url,以http或https开头(和redirect url在同一域名下面),用于通知密码检测结果, 必须以GET方式访问
返回数据:
返回数据是通过callback返回, callback url中返回参数如下:
xmResult:true 验证成功, false或者没有改参数表示验证错误
由随机数和时间戳组成,格式:随机数:当前分钟数(1970 年 1 月 1 日午夜0点之间的时间差)
对返回结果的签名,为了验证返回结果没有被窜改
一个新的授权码,第三方可以使用code换取新的access token(在安全性要求较高的地方可以再次用access token换取userId,以验证用户身份的合法性)
小米验证的实际账号(不一定是第三方传上来的账号),可能会被人恶意窜改
第三方必须在callback中验证_ xmSign, 否则造成的损失由第三方负责。
如何验证签名:
Callback格式参见4.2.1请求内容标准化,签名参数不包括_xmNonce和_xmSign签名。
签名算法使用HmacSha1, AppSecret是申请app的时候系统分配的可以,可以登录获取,每个用户不同,_xmSign = HmacSha1(Callback字符串, AppSecret)。
签名验证示例:
第三方提供Callback:
小米验证成功之后调用callback:
其中_xmNonce=21337,_xmSign= O044CQ9pBNgV3qgcVw760h3naNI=,下面是部分代码示例:
String url = &&;
URIBuilder followupBuilder = new URIBuilder(url);
List&NameValuePair& resultParaList = new ArrayList&NameValuePair&();
Map&String, String& parameterThird = new HashMap&String, String&();
for (NameValuePair pair : followupBuilder.getQueryParams()) {
if(!pair.getName().startsWith(&_&)) {
resultParaList.add(new BasicNameValuePair(pair.getName(), pair.getValue()));
parameterThird.put(pair.getName(), pair.getValue());
Assert.assertEquals(&true&, parameterThird.get(&xmResult&));
Assert.assertNotNull(parameterThird.get(&code&));
String qs = URLEncodedUtils.format(resultParaList, Constants.UTF_8_CHARSET);
String nonce = parameterThird.get(&_xmNonce&);
第三方需要check一下nonce 防止重放
String sign =getMacAccessTokenSignatureString(nonce, &GET&, followupBuilder.getHost(),followupBuilder.getPath(),qs,clientKey, &HmacSHA1&);
Assert.assertEquals(sign, parameterThird.get(&_xmSign&));
5.5获取用户绑定的手机号码
URL: https://open./user/phone
HTTP请求方式:GET
请求参数:
表 5-5获取用户绑定手机号参数表
申请应用时分配的App Id。
用户授权时client得到的token
Header数据:参考第4节中方式生成Header授权信息。
返回数据:
如果访问令牌验证通过,会返回用户手机号相关的信息, 返回格式为Json文本, 格式如下:
&result&: &ok&,
&description&: &成功&,
phone:&用户手机号,无国家地区前缀(如:+852为香港)则为中国大陆&
如果访问令牌验证错误,会返回错误信息, 返回格式为Json文本, 格式如下:
&result&: &error&,
&description&: &错误描述&,
&code&: 错误码
5.6上传图片
URL: https://open./user/photo/upload
HTTP请求方式:GET
请求参数:
表 5-6获取用户绑定手机号参数表
申请应用时分配的App Id。
用户授权时client得到的token
上传的图片
Header数据:参考第4节中方式生成Header授权信息。
返回数据:
如果访问令牌验证通过,会返回用户手机号相关的信息, 返回格式为Json文本, 格式如下:
“result”: “ok”,
“description”: “成功”,
“mfsFileId”: “”
“code”: 0
如果访问令牌验证错误,会返回错误信息, 返回格式为Json文本, 格式如下:
“result”: “error”,
“description”: “错误描述”,
“code”: 错误码
String url = &/user/photo/upload&;
JSONObject json = this.getMacTypeToken();
String accessToken = json.getString(&access_token&);
url = url + &?& + &clientId=& + clientId + &&token=& + URLEncoder.encode(accessToken, &UTF-8&);
System.out.println(&~~~~~~~~~~~~&);
InputStream stream = OAuthTest.class.getResourceAsStream(&/yingu.jpg&);
System.out.println(&~~~~~~~~~~~~&);
Assert.assertEquals(stream==null, false);
byte[] date =input2byte(stream);
System.out.println(date.length);
HttpClient httpClient = new HttpClient();
httpClient.getParams().setParameter(&http.connection.timeout&, new Integer(10000)); // 等等设置各种基本属性....
PostMethod post = new PostMethod(TestConstants.OPENAPIHOST + url);
post.setRequestHeader(&Referer&, TestConstants.OPENAPIHOST + url);
ByteArrayPartSource bp = new ByteArrayPartSource(&yingu.jpg&, date);
FilePart bfp = new FilePart(&yingu.jpg&, bp);
bfp.setContentType(&mutipart/form-data&);
bfp.setName(&photo&);
bfp.setTransferEncoding(null);
Part[] parts = {bfp};
post.setRequestEntity(new MultipartRequestEntity(parts, post.getParams()));
long length =
post.getRequestEntity().getContentLength();
post.setRequestHeader(&Content-Length&, length + &&);
httpClient.executeMethod(post);
String reponse=post.getResponseBodyAsString();
System.out.println(reponse);
JsonObject jsonObject=new JsonObject(reponse);
jsonObject=jsonObject.getJsonObject(&data&);
Assert.assertEquals(jsonObject.getString(&errorMessage&), &成功&);
String downloadString=jsonObject.getString(&mfsFileId&);
URL downloadUrl = new URL(downloadString);
InputStream downloadStream = downloadUrl.openStream();
System.out.println(&~~~~~~~~~~~~&);
Assert.assertEquals(downloadStream==null, false);
byte[] date2 =input2byte(downloadStream);
System.out.println(date2.length);
Assert.assertEquals(true, date2.length!=0);
5.7修改第三方名片
URL: https://open./user/changeProfileJson
HTTP请求方式:POST
请求参数:
表 5-5获取用户绑定手机号参数表
申请应用时分配的App Id。
用户授权时client得到的token
Header数据:参考第4节中方式生成Header授权信息。
返回数据:
如果访问令牌验证通过,会返回用户手机号相关的信息, 返回格式为Json文本, 格式如下:
“result”: “ok”,
“description”: “成功”,
“data”: {
Birthday:””
sex:”1”
miliaonick:”hello”
miliaoicon:” ”
“code”: 0
如果访问令牌验证错误,会返回错误信息, 返回格式为Json文本, 格式如下:
“result”: “error”,
“description”: “错误描述”,
“code”: 错误码
String url = &/user/changeProfileJson&;
List&NameValuePair& params = new ArrayList&NameValuePair&();
params.add(new BasicNameValuePair(&birthday&, &&));
params.add(new BasicNameValuePair(&sex&,
params.add(new BasicNameValuePair(&nickname&, &TestOpen&));
params.add(new BasicNameValuePair(&icon&, &&));
Response response = sendOpenApiRequest(url, &POST&, params, true);
System.out.println(response.toString());
String postString=response.body().asString();
JsonObject json=new JsonObject(postString);
Assert.assertEquals(json.getString(&result&),&ok&);
json=json.getJsonObject(&data&);
Assert.assertEquals(json.getString(&nickname&), &TestOpen&);
Assert.assertEquals(json.getString(&birthday&), &&);
Assert.assertEquals(json.getString(&sex&),
Assert.assertEquals(json.getString(&icon&), &&);
System.out.println(&~~~~~~~~~~~~~~~~~~~~~~~~~&);
//Thread.sleep(1000);
String urlGet= &/user/profile&;
response = sendOpenApiRequest(urlGet, &GET&, null, true);
System.out.println(response.toString());
String getString=response.body().asString();
json=new JsonObject(getString);
Assert.assertEquals(json.getString(&result&),&ok&);
json=json.getJsonObject(&data&);
Assert.assertEquals(json.getString(&miliaoNick&), &TestOpen&);
Assert.assertEquals(json.getString(&birthday&), &&);
Assert.assertEquals(json.getString(&sex&),
Assert.assertEquals(json.getString(&miliaoIcon&), &&);
6 使用方法和注意事项
最快的方法当然是使用sdk,如果您非要自己写一个的话请详细看此文档的前面几章,且注意以下几点
1.您可以自己先在浏览器上测试2.2授权接口的使用。
2.授权码code只能使用一次,使用第二次时就是无效。
3.第5章的账号url不能直接使用,可以用mac加请求header后使用,注意若直接使用若是正确的会返回验证不合法。
4.测试第5章内容时若返回400请检查uri是否正确,是否加入get的请求值,若返回401请测试header是否正确。
5.请十分注意mac的当前分钟数,小米设定分钟误差不超过5分钟,如果错误我们会返回401。
适用于Java 版本OAuth2.0接口
适用PHP版本OAuth2.0接口
Python SDK
适用于Python版本OAuth2.0接口
适用于C#版本OAuth2.0接口
适用于ruby版本OAuth2.0接口
Android SDK
适用于Android平台
适用于IOS平台
OAuth iOS SDK说明
本SDK为开发者封装了iOS上OAuth登录小米账号的方法,并且提供了访问小米账号Open API的必要工具。用户可以试用SDK中提供的方法进行登录,并且获取小米账号提供的资料。
本文档将对使用IOS SDK时所用的一些参数、接口进行说明,并分析一个简单示例,帮助第三方更方便的使用SDK(一些不使用的接口只做简单说明)。
分配给每个第三方应用的app key。用于鉴权身份,显示来源等功能。
代表用户身份的code,用来给第三方的服务器向小米账号服务器申请Access Token
AccessToken
表示用户身份的token,用于小米账号API的调用。
ExpirationDate
过期时间,用于判断登录是否过期。
RedirectURI
应用回调页面,第三方应用在小米账号开发平台注册的url。
EncryptAlgoritm
小米账号API调用时所用的加密算法,具体算法由SDK提供,第三方不用处理。
EncryptKey
小米账号API调用时,加密算法所用的key。
MiPassport iOS& SDK说明文档即本文档;
SDK文件夹包括两个文件:
MiPassport.framework打包了iOS SDK的头文件定义和具体实现。
MiPassport.bundle打包了iOS SDK需要的资源文件。
其中MiPassportDemo是一个示例代码,里面使用MiPassport SDK实现了小米账号的登录、code获取、拉取小米用户资料以及关系、登出小米账号等功能。可以配合本文档理解。
MiPassport/MiPassport.h
该文件中提供了申请小米账号授权所需要的接口及回调协议。
MiPassport
提供给第三方应用的主要接口,提供登录、获取code以及访问小米账号开放API的方法。登录结果也会保存在该类的对象中返回给第三方应用。
MPSessionDelegate
第三方应用需要实现该协议来处理登录授权的回调结果。
MiPassport/MPReqeust.h
该文件中提供了访问小米账号API所需要的接口及回调协议。
请求小米账号API的类,一个简单的http client,封装了访问小米账号API所需要的方法,第三方使用该类访问小米账号的开放API。
MPRequestDelegate
实现该协议来处理开放API请求的各种回调。
MiPassport/MPAuthorizeDialog.h
MPAuthorizeDialog
小米账号认证界面,用来支持OAuth 2.0授权。应用申请授权时,由MiPassport调用此类,请求用户登录小米账号并授权应用使用,授权成功后将会通过MPSessionDelegate返回给应用。第三方不需要使用此类,由MiPassport使用并管理。
MPConstants.h
该文件中定义了SDK所用的各种常量。
使用步骤及示例
1. 添加framework及bundle
将 SDK中的MiPassport.framework和MiPassport.bundle文件拷贝到应用开发的目录下。
然后将MiPassport.framework从SDK的保存目录拖拽到工程导航视图(project navigator)中的Frameworks虚拟目录下。
在“Build Phases”中选择展开“Copy Bundle Resources”一栏,并点击“+”图标。选择“Add Other…”,进入iOS SDK文件所在目录,选择MiPassport.bundle,点击回车或者点击“Open”。返回后看到MiPassport.bundle已经在“Copy Bundle Resources”中出现。
2. 实现MPSessionDelegate
在需要使用SDK的地方,首先引用MiPassport/MiPassport.h.应用在OAuth 2.0授权前需要实现该协议,来处理登录授权中的各种结果。
- (void)passportDidLogin:(MiPassport *)passport{
NSLog(@”passport login succeeded, token:%@, token type:%@, expiration date:%@, encrypt algorithm:%@,
encrypt key:%@”, passport.accessToken, passport.tokenType, passport.expirationDate,
passport.encryptAlgorithm, passport.encryptKey);
}//登录失败
- (void)passport:(MiPassport *)passport failedWithError:(NSError *)error{
NSDictionary *errorInfo = [error userInfo];
NSLog(@”passport login failed with error: %d info %@”, [error code],
[errorInfo objectForKey: @&error_description&]);
// 用户取消登录
- (void)passportDidCancel:(MiPassport *)passport{
NSLog(@”passport login did cancel”);
//登出成功
- (void)passportDidLogout:(MiPassport *)passport{
NSLog(@”passport did log out”);
//获取code
- (void)passport:(MiPassport *)passport didGetCode:(NSString *)code{
NSLog(@”passport did get code: %@”, code);
//token过期
- (void)passport:(MiPassport *)passport accessTokenInvalidOrExpired:(NSError *)error{
NSLog(@”passport accesstoken invalid or expired”);
3. 初始化MiPassport对象
第三方App可以在任何地方初始化MiPassport,但推荐由一个全局的对象来持有passport(如AppDelegate),方便用户在各个界面使用passport的信息。将登录信息持久化,可以减少用户登录的过程。
_passport = [[MiPassport alloc] initWithAppId:@”608″
redirectUrl:@”” andDelegate:self];
4. 实现登录操作
应用创建MiPassport对象后,只需调用loginWithPermissions方法即可实现Implicit Flow登录,即直接由客户端获取Access Token即相关信息。
- (IBAction)loginPassport:(id)sender {
[_passport loginWithPermissions:nil];
5. 获取code
应用如要实现Authorization Code流程登录,可以通过MiPassport中的applyPassCodeWithPermisions来获取。
- (IBAction)retriveCode:(id)sender {
[_passport applyPassCodeWithPermissions:nil];
6. 实现MPRequestDelegate
应用在调用小米账号Open API前需要实现该协议,来处理请求的各种结果。
// 请求向服务器发送
- (void)requestLoading:(MPRequest *)request{
NSLog(@”request start loading”);
}// 请求收到服务器回复,开始接受数据
- (void)request:(MPRequest *)request didReceiveResponse:(NSURLResponse *)response{
NSLog(@”request did receive response”);
// 请求失败, error包含错误信息
- (void)request:(MPRequest *)request didFailWithError:(NSError *)error{
NSLog(@”request did fail with error code: %d”, [error code]);
if ([request.url hasSuffix:@&user/profile&]) {
else if ([request.url hasSuffix:@&user/relation&]){
// 请求成功,result为处理后的请求结果
- (void)request:(MPRequest *)request didLoad:(id)result{
NSLog(@”request did load: %@”, [result JSONRepresentation]);
if ([request.url hasSuffix:@&user/profile&]) {
else if ([request.url hasSuffix:@&user/relation&]){
// 请求成功,data为未经处理的服务器返回数据
- (void)request:(MPRequest *)request didLoadRawResponse:(NSData *)data{
NSLog(@”request did load raw response: %@”, data);
7. 实现请求小米账号Open API操作
应用登录成功后,通过创建的MiPassport对象调用request方法实现小米账号API的请求。
- (IBAction)getUserInfo:(id)sender {
[_passport requestWithURL:@&user/profile& params:[NSMutableDictionary dictionaryWithObject:_passport.appId forKey:@&clientId&]
httpMethod:@”GET” delegate:self];
8. 登出小米账号
调用MiPassport的logout方法即可实现登出。
1. 为什么需要做MAC签名?
小米开放平台使用作为验证与授权协议。OAuth是一个开放标准,允许第三方应用在用户授权的情况下访问其在网站上存储的信息资源(如账号信息,好友列表),而这一过程中网站无需将用户的账号密码告诉给第三方应用。小米OAuth协议支持Mac Type 的AccessToken,所以必须使用Mac Access Authentication相对应的签名作为完全访问的验证。()
2. 为什么需要用户授权,什么时候需要授权?
按照OAuth开放协议,小米作为服务提供方必须在用户授权同意的情况下才能将用户的资源提供给其他第三方使用。
3. 如果是网页应用没有apk包,如何获取appId, appKey,等信息?
如果不是一个客户端应用,可以在 相应的AppId等信息。
4. 已经创建了app,请求api为何提示error=96003 &error_description=客户端标识符无效 ?
1) 一个新的app如果需要使用小米开放平台的OAuth服务,需要开通账号服务。开启账号服务步骤:进入应用详情 à 帐号接入服务(详情) à 立即开启 à 输入Redirect URL。
2) URL请求没有做urlEncoding处理,导致参数传递到服务器上有错误。
5. 请求api接口返回 {“result”:”error”,”description”:”用户或授权服务器拒绝了请求“,”code”:”96012″} 这样错误的原因是什么?
原因如下:
1) 请求使用的accesToken和 appID不是对应的或者输入的appID不是由小米米开发平台产生的,可以通过获取获取openId的接口来验证参数的正确性。
2) Mac签名值错误,下面给出一个例子说明每个步骤的输入输出值。
请求的URL输入:以请求用户基本信息api为例说明, 请求的url如下:
随机产生的Nonce: 82360
Http Method: GET
URL拆解如下:
**Host: **open.
** Uri path:** /user/profile
**Url query: **(按照参数名字典序排列)
clientId=608&token=eJxjYGAQydknLLCFsVyIR-DxSqdTnQFGfX4yDAwMjAzxQJIheJfnRTDtvAhMM8SE_2FgWDw7Rg3MYzdUMFIwVjABMplzE5MBClYRuw
签名的格式化字符串(\n为换行字符):
82360\nGET\nopen.\n/user/profile\nclientId=608&token=eJxjYGAQydknLLCFsVyIRDxSqdTnQFGfX4yDAwMjAzxQJIheJfnRTDtvAhMM8SE_2FgWDw7Rg3MYzdUMFIwVjABMplzE5MBClYRuw\n
Mac Key: ORhx44qK6Alqf8vt2rGB5f-oPq0
签名结果输出:
Signature(Base64之后的结果): 9uvros2WcjMaJ3pH25eQZU9p5pA=
6. 访问Api后返回{ “result”: “error”,”description”: “参数nonce已经被使用“,
“code”: 21308} 是什么原因?
原因如下:
1) 传递的nonce和其他的发生的碰撞,一般重试一次错误消失;
2) Nonce中的时间部分(冒号后面的部分)为标准北京时间的分钟数,在线时间参考:
7. 什么是token,为什么要获得token,怎样获得token?
首先明确个目标~使用我们的oauth实际上是获得用户的第三方token,关于token的定义就相当于用户已经login的cookie
那什么叫token 比如一个人要登陆肯定需要用户名密码~~当然我们不可能把密码给你让你登陆~~所以我们给你自己生成的token(当然对方得授权给你们,相当于一种密码)~~你拿这个人的userid和token就能来登陆
我们分两种方式得到token 两种方式(当然都要经过授权地址)的区别是这样的
一种code方式,这种方式很麻烦,大概是这样子,用户授权后返回个code到r-url(关于r-url等参数的求的在后面),第三方就是你们~得到code能请求到r-token和token(code是一次性的只能请求一次),如果以后token过期可以用r-token拿token
二种token方式,直接用户授权后返回个token
关于这两种的区别在于第一种安全性更高适合有服务器(有https)的人群,第二种适合没服务器的
8. 什么是授权地址?
事实在对接的过程有很多同志不知道 授权地址的概念~~
这就是授权地址
8. code和token有什么区别?
code接入难,适合于有自己的服务器(https)的用户,当然安全性高,token接入简单,适合于没有服务器的用户
如文档所示
/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&redire
ct_uri=http%3A%&response_type=token
最后一个response_type就是token和code的区别
Documentation built with .

我要回帖

更多关于 小米手机游戏帐号 的文章

 

随机推荐