支持开放平台模式

本文单纯从简单的技术实现来讲,不涉及开放平台的多维度的运营理念。

什么是开放平台

通过开放自己平台产品服务的各种 API 接口,让其他第三方开发者在开发应用时根据需求直接调用,例如微信登录、QQ 登录、微信支付、微博登录、热门等。 让第三方应用通过开发平台,使得自身海量数据资源得到沉淀(变现) 目前国内主流的网站的的开放平台,都是基于 oauth2.0 协议进行做的开放平台

  • 微信开放平台授权机制流程图
微信开放平台授权机制流程图
  • 微博开放平台授权机制流程图
微博开放平台授权机制流程图

测试开放平台获取授权码

  • 注册支持授权码的客户端
INSERT INTO `sys_oauth_client_details`(`id`, `client_id`, `resource_ids`, `client_secret`, `scope`, `authorized_grant_types`, `web_server_redirect_uri`, `authorities`, `access_token_validity`, `refresh_token_validity`, `additional_information`, `autoapprove`, `del_flag`, `create_by`, `update_by`, `create_time`, `update_time`, `tenant_id`) VALUES (1000, 'open', NULL, 'open', 'server', 'refresh_token,authorization_code', 'https://pig4cloud.com', NULL, NULL, NULL, '{
	"appName":"测试应用"
}', 'false', '0', ' ', ' ', NULL, NULL, 1);
  • 浏览器访问如下链接, 必须完全复制不要修改任何参数

http://localhost:3000/oauth2/authorize?scope=server&client_id=open&response_type=code&redirect_uri=https://pig4cloud.com

  • 统一认证界面 (admin/123456)
1741509405
  • 授权确认
1741509426
  • 登录成功带着 code 回调到目标接口
授权码回调示意
curl --location --request POST 'http://127.0.0.1:3000/oauth2/token' \
  --header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
  --header 'Authorization: Basic b3BlbjpvcGVu' \
  --form 'grant_type=authorization_code' \
  --form 'scope=server' \
  --form 'code=上文获取到的code' \
  --form 'redirect_uri=https://pig4cloud.com'
示例代码

提供一个OKHTTP 调用生成的示例

OkHttpClient client = new OkHttpClient().newBuilder()
   .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
   .addFormDataPart("grant_type","authorization_code")
   .addFormDataPart("scope","server")
   .addFormDataPart("code","yzRNnh0JNwn8_lD1cncPiiqKhhi0um5s-OyK_Dn514rGAko1dW3LItJTQgKb4PMs-dEb-RbRQW7LvtluFBMyxYFuHsK04U6X4ISd0tIUNhHY6U92myCnM2qx6SqHgGOW")
   .addFormDataPart("redirect_uri","https://pig4cloud.com")
   .build();
Request request = new Request.Builder()
   .url("http://127.0.0.1:3000/oauth2/token")
   .method("POST", body)
   .addHeader("Authorization", "Basic b3BlbjpvcGVu") // base64(clientId:clientSecret)
   .build();
Response response = client.newCall(request).execute();

退出端点

http://localhost:3000/oauth2/logout

退出端点可以带参数 redirect_url,用于指定退出后跳转的 URL,例如:?redirect_url=https://baidu.com