本文转载自华为开发者联盟
概述
开放平台采用OAuth2.0协议作为第三方应用提供用户接入服务。OAuth2.0是一个开放授权协议,它可以使第三方应用在不获取用户的用户名和密码的前提下,访问用户授权的资源。OAuth2.0协议规范,可访问官方网站
流程
1) 创建应用,获取client_id和client_secret。
2) 客户端应用向华为OAuth2.0服务发起一个授权请求。
3) 华为OAuth2.0服务向用户展示一个授权页面,提醒用户客户端应用需要获取用户的哪些信息。
4) 用户授权客户端应用后,可获得一个access_token
5) 通过access_token,客户端应用可以通过华为Open Api访问用户授权的数据。
Access Token 获取方式
注意:目前access_token的有效期通过返回的expires_in来传达,access_token的有效时间可能会在未来有调整。access_token在有效期内尽量复用,业务要根据这个有效时间提前去申请新access_token即可。如果业务频繁申请access_token,可能会被流控。业务在API调用获知access_token已超时的情况下(NSP_STATUS=6,详细错误列表),可以触发access_token的申请流程。
Implicit Grant
又称User-Agent Flow,适用于所有无Server端配合的应用(桌面客户端需要内嵌浏览器),可以访问与用户相关的Open API
Client Credentials
即通过应用的密钥获取Access Token,适用于任何类型应用。
注意:通过此方式获取的access_token,仅可以访问与用户无关的Open API
3.1
Implicit Grant方式获取access_token
获取access_token
请求格式
可通过浏览器访问
https://login.vmall.com/oauth2/authorize
参数:
client_id:必选,申请应用时获得的应用 ID。
response_type:必选 ,此时必须为”token”
redirect_uri:必选,授权后要回调的URI,access token会附在URI上。
scope:可选,Access Token的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限)并只列出基础服务。
state:可选,授权服务器在回调时(重定向用户浏览器到“redirect_uri”时),会在uri中原样回传该参数。OAuth2.0标准协议建议,利用state参数来防止CSRF攻击。
display:可选,用户授权页面,目前支持page、dialog、tvDialog、mobile,系统默认显示display=page的页面。
举例:
https://login.vmall.com/oauth2/authorize?
response_type=token&
client_id=12345&
redirect_uri=http%3A%2F%2Fwww.abc.com%2Fredirect%2Foauth2
响应格式
access_token:要获取的Access Token;
expires_in:Access Token的有效期,以秒为单位;
scope:Access Token的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限);
state:请求中的参数,原样返回
HTTP/1.1 302 Found
Location:
http://www.abc.com/redirect/oauth2#access_token=BFEsZqBuaW%5C%2F%5C%2F9GGn1mLt%2BKykzfBObIy6V3eN20ufoNiAERl33oVGzlN5TE5qeA%3D%3D&expires_in=86400
错误响应
error:错误码。
error_description:错误描述信息,用来帮助理解和解决发生的错误。
state:请求中的参数,原样返回
HTTP/1.1 302 Found
Location:
http://www.abc.com/redirect/oauth2#error=access_denied&error_description=user%20didnot%20allow%20your%20authorization%20request
3.2
Client Credentials方式获取access_token
获取access_token
请求格式
https://login.vmall.com/oauth2/token
参数:
grant_type:必选 ,此时必须为”client_credentials”
client_id:必选,申请应用时获得的应用 ID。
client_secret:必选,申请应用时获得的应用密钥。
scope:可选,以空格分隔的权限列表,若不传递此参数,默认权限包括(nsp.auth nsp.user nsp.vfs nsp.ping openpush.message)
POST /oauth2/token HTTP/1.1
Host: login.vmall.com
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=12345&client_secret=bKaZ0VE3EYrXaXCdCe3d2k9few
响应格式
access_token:要获取的Access Token;
expires_in:Access Token的有效期,以秒为单位;
scope:Access Token的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限);
举例:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "BFEsZqBuaW\/\/9GGn1mLt+KykzfBObIy6V3eN20ufoNiAERl33oVGzlN5TE5qeA==",
"expires_in": 86400,
}
错误响应
error:错误码。
error_description:错误描述信息,用来帮助理解和解决发生的错误。
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_code",
"error_description": "The code is invalid"
}