正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史记录

版本 1 当前 »


一丶申请AppKey与AppSecret

与管理员联系获取appKey与appSecret,appKey是与数字人平台的客户渠道绑定的。

二丶 免登录服务端接入

2.1 AppKey+AppSecret 换 rabbitToken

服务调用数字人开放平台接口获取rabbitToken,接口文档地址:获取rabbitToken

rabbitToken 是调用所有数字人开放平台接口的令牌。

请妥善保管appKey和appSecret ,一般保存在服务端配置文件中。

2.2  携带rabbitToken 进行数字人平台登录并获取到重定向地址。

服务端提供联合登录接口给前端,接口内部逻辑:调用数字人开放平台接口(thirdId+thirdUrl)获取到重定向地址,并进行重定向。 接口文档地址:获取重定向URL

数字人开放平台内部逻辑:

  1. 判断是否绑定第三方用户Id(thirdId)
  2. 生成ticket 对于缓存了thirdId等
  3. 已绑定:生成数字人平台tz_token,并保存到ticket中
  4. 未绑定:后续要携带thirdId跳转到登录页面进行登录并绑定thirdId

注意:1. 接口请求头要携带tabbitToken

           2. 如果是内嵌ifream形式 thirdUrl必须传入当前域名,数字人平台编辑器必须是同源。

2.3 前端调用服务端联合登录接口,进行免登录。

 


三丶Ifream内嵌页面处理

3.1 Nginx处理

要保证数字人平台与第三方是同一个域名,不然数字人编辑器内有浏览器同源策略限制。

需要第三方nginx代理一下数字人平台的域名。

配置参考如下:

server {

        listen 80;

        listen 443 ssl http2;

        ssl_certificate "/opt/app/all_config/abug/cert.pem";

        ssl_certificate_key "/opt/app/all_config/abug/key.pem";

        ssl_protocols TLSv1.1 TLSv1.2;

        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

        ssl_prefer_server_ciphers on;

        ssl_session_cache shared:SSL:10m;

        ssl_session_timeout 10m;

        server_name abug.jy520.fun;

        # 这里是第三方主页

        location / {

              # 需要加两个允许跨域得头 不然无法进入数字人编辑器

              add_header Cross-Origin-Opener-Policy same-origin;

              add_header Cross-Origin-Embedder-Policy require-corp;

              root /opt/app;

              index test.html;

        }

        # 代理兔展后端

        location  /api/rabbitlab{

           proxy_pass https://digitalman.h5no1.com;

        }

        # 代理兔展开放平台

        location  /open/platform{

           proxy_pass https://digitalman.h5no1.com;

        }

        # 代理兔展前端页面

        location /digitalman {

           proxy_pass https://digitalman.h5no1.com;

       }

}

 

3.2 前端Ifream参考

 

<iframe src="https://abug.jy520.fun/demo/unionLogin?thirdId=third_3" height="800px" width="100%" ></iframe>

其中 /demo/unionLogin 接口是第三方服务端提供  也就是2.2步中的。

 

四丶示例代码

4.1后端接入示例:

@Slf4j

@Component

public class RabbitOpenPlatformManager {

 

    @Value("${openPlatform.host:https://test.digitalman.h5no1.com}")

    private String host;

    @Value("${openPlatform.appKey:069251338630322213976003}")

    private String appKey;

    @Value("${openPlatform.appSecret:924025c658bab641b4432b31921a37007d989e4be36f21c06dd477d2fb604d36}")

    private String appSecret;

    @Value("${openPlatform.thirdUrl:https://test.digitalman.h5no1.com}")

    private String thirdUrl;

    private static final String TOKEN_KEY = "openPlatform:token";

    @Resource

    private RedisTemplate<String, String> redisTemplate;

    private final RestTemplate restTemplate = new RestTemplate();

 

 

    /**

     * 获得令牌

     *

     * @return {@link String}

     */

    public String getToken() {

        String rabbitToken = redisTemplate.opsForValue().get(TOKEN_KEY);

        if (rabbitToken != null) {

            return rabbitToken;

        }

        String url = "/open/platform/auth/getRabbitToken";

        HashMap<String, String> map = new HashMap<>(2);

        map.put("appKey", appKey);

        map.put("appSecret", appSecret);

        ParameterizedTypeReference<RabbitResponse<AppLoginResponse>> responseType = new ParameterizedTypeReference<RabbitResponse<AppLoginResponse>>() {

        };

        HttpHeaders headers = new HttpHeaders();

        headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8"));

        HttpEntity<String> entity = new HttpEntity<>(JSONUtil.toJsonStr(map), headers);

        ResponseEntity<RabbitResponse<AppLoginResponse>> exchange = restTemplate.exchange(host + url, HttpMethod.POST, entity, responseType);

        RabbitResponse<AppLoginResponse> response = exchange.getBody();

        log.info("response:{}", response);

        if (response == null) {

            throw new RuntimeException("响应异常");

        }

        if ("0".equals(response.getCode())) {

            AppLoginResponse appLoginResponse = response.getData();

            rabbitToken = appLoginResponse.getRabbitToken();

            redisTemplate.opsForValue().set(TOKEN_KEY, rabbitToken, appLoginResponse.getExpireIn() / 2, TimeUnit.SECONDS);

            return rabbitToken;

        } else {

            throw new RuntimeException(response.getErrorMsg());

        }

    }

 

    /**

     * 联合登录

     *

     * @param thirdId 第三方账户id

     * @return {@link String}

     */

    public String unionLogin(String thirdId) {

        String url = "/open/platform/digital/third/getRedirectUrl";

        HashMap<String, String> map = new HashMap<>(2);

        map.put("thirdId", thirdId);

        map.put("thirdUrl", thirdUrl);

        ParameterizedTypeReference<RabbitResponse<RedirectUrlVo>> responseType = new ParameterizedTypeReference<RabbitResponse<RedirectUrlVo>>() {

        };

        HttpHeaders headers = new HttpHeaders();

        headers.set("rabbitToken", getToken());

        headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8"));

        HttpEntity<String> entity = new HttpEntity<>(JSONUtil.toJsonStr(map), headers);

        ResponseEntity<RabbitResponse<RedirectUrlVo>> exchange = restTemplate.exchange(host + url, HttpMethod.POST, entity, responseType);

        RabbitResponse<RedirectUrlVo> response = exchange.getBody();

        if (response == null) {

            throw new RuntimeException("响应异常");

        }

        if ("0".equals(response.getCode())) {

            RedirectUrlVo data = response.getData();

            return data.getRedirectUrl();

        } else {

            throw new RuntimeException(response.getErrorMsg());

        }

    }

 

    @Data

    static class RabbitResponse<T> {

        private String code;

        private String showMsg;

        private String errorMsg;

        private String requestId;

        private T data;

    }

 

    @Data

    static class AppLoginResponse {

        /**

         * 授权令牌

         */

        private String rabbitToken;

 

        /**

         * 授权令牌 的有效期

         */

        private Long expireIn;

 

    }

 

    @Data

    static class RedirectUrlVo {

 

        /**

         * 重定向地址

         */

        private String redirectUrl;

    }

 

}

@RequestMapping("/")

@RestController

public class DemoController {

    @Resource

    private RabbitOpenPlatformManager rabbitOpenPlatformManager;

 

    @GetMapping("/unionLogin")

    public void unionLogin(String thirdId, HttpServletResponse response) throws IOException {

        String redirectUrl = rabbitOpenPlatformManager.unionLogin(thirdId);

        response.sendRedirect(redirectUrl);

    }

 

}

 

4.2前端示例

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title></title>

</head>

<body>

<iframe src="https://xxx/demo/unionLogin?thirdId=third_3"  height="800px" width="100%" id="myIframe"></iframe>

</body>

</html


搜索

复制

  • 无标签