写在前面
源码 。
本文看下OAuth2.0的另外3中授权流程,资源拥有者凭据许可,客户端许可,隐式许可。分别看下具体的使用流程以及该使用场景。
1:资源拥有者凭据许可
资源拥有者凭据许可,这里资源拥有者的凭据是什么呢?自然就是用户名密码了,也就是使用用户名密码来获取访问令牌,这种授权方式流程如下:
适用的场景是官方出品的亲儿子应用,本来就是一家人,自然是可以使用用户名密码来授权的。另外需要注意grant_type需要设置为password。
Map<String, String> params = new HashMap<String, String>();
params.put("grant_type","password");
params.put("app_id","APPIDTEST");
params.put("app_secret","APPSECRETTEST");
params.put("name","NAMETEST");
params.put("password","PASSWORDTEST");
String accessToken = HttpURLClient.doPost(oauthURl,HttpURLClient.mapToStr(params));
访问地址http://localhost:8899/otherThree/testOtherThreee
,测试:
录入用户名密码:
接着就能获取到token了:
2:客户端许可
客户端许可,是客户端自己直接使用授权服务颁发的app_id和app_sercet来获取令牌,流程如下:
适用的场景是获取不属于用户的信息,比如天气信息,微信的logo,微信当前最新的版本号等。另外需要注意grant_type需要设置为client_credentials。
Map<String, String> params = new HashMap<String, String>();
params.put("grant_type","client_credentials");
params.put("app_id","APPIDTEST");
params.put("app_secret","APPSECRETTEST");
String accessToken = HttpURLClient.doPost(oauthURl,HttpURLClient.mapToStr(params));
访问地址http://localhost:8899/otherThree/testOtherThreee
,测试:
成功获取令牌:
3:隐式许可
隐式许可,直接使用appid来获取令牌,流程如下:
适用的场景是没有server的内嵌在浏览器中的应用。另外需要注意将grant_type设置为token:
Map<String, String> params = new HashMap<String, String>();
params.put("response_type","token");//告诉授权服务直接返回access_token
params.put("redirect_uri","http://localhost:8080/AppServlet-ch02");
params.put("app_id","APPIDTEST");
String toOauthUrl = URLParamsUtil.appendParams(oauthUrl,params);//构造请求授权的URl
response.sendRedirect(toOauthUrl);
访问地址http://localhost:8899/otherThree/testOtherThreee
,测试:
直接获取到令牌:
写在后面
参考文章列表
多知道一点
4种许可类型对比
本质上都是换取令牌access_token,只不过不同的授权类型换取令牌时需要提供的内容不同。