java - 您如何向 Cisco Contact Center Express Identity Service 进行身份验证?
问题描述
我正在构建一个 3rd 方应用程序来通过 Contact Center Express 进行身份验证。文档是必要的,但不足以完成此操作。例如,
// Get Access Token for the received Authorization Code
String redirectURI = config.getRedirectUri();
AccessToken token = client.getAccessToken(authCode, redirectURI);
您何时何地将用户重定向到联络中心进行身份验证?我观察到 Finesse 会将用户重定向到
但是在哪里指定使用身份服务 (IDS) 路径/ids/v1/oauth/authorize
?状态是必需的参数吗?IDS SDK 是否处理回调路径/desktop/sso/authcode
?我想它没有,但是将发送给它的参数是什么?我正在使用 Spring 框架。
我是要对整个过程进行逆向工程,还是缺少其他文档?
即使在收到 OAuth 令牌后,我如何使用它对其他思科产品进行其他 REST 调用?Finesse REST API 仅提及 HTTP 基本身份验证。没有提及“授权:承载”令牌的标头。
https://developer.cisco.com/docs/finesse/#!sign-in-to-finesse/sign-in-to-finesse
解决方案
我不得不在所有重定向之后对其进行逆向工程。
@Controller
public class SSOController {
@Autowired
private IdSClientConfigurationImpl config;
@Autowired
private IdSClient client;
@PostMapping("/login")
public String login(@RequestParam(name="user", required=true) String user) {
// redirect the user to the Cisco Contact Center Express Identity Service
String redirectURI = config.getRedirectUri();
String clientId = config.getClientId();
URI uri = UriComponentsBuilder
.fromUriString("https://contact-center-express:8553/ids/v1/oauth/authorize")
.queryParam("redirect_uri", "{redirect_uri}")
.queryParam("client_id", "{client_id}")
// .queryParam("state", "{state}") // base64 encoded
.queryParam("response_type", "code")
.build(redirectURI, clientId);
return "redirect:"+uri.toString();
}
@GetMapping("/idscallback")
public String idscallback(
@RequestParam(name="code", required=true) String code,
@RequestParam(name="state", required=false) String state,
HttpSession session) throws IdSClientException {
// Get Access Token for the received Authorization Code
String redirectURI = config.getRedirectUri();
AccessToken token = client.getAccessToken(code, redirectURI); // why do I need redirectURI when it's already redirected?
String accessTokenString = token.getAccess_token();
session.setAttribute("token", accessTokenString);
// model.addAttribute("token", accessTokenString);
return "redirect:/";
}
而在遥远的豆子里……
@Bean
public IdSClientConfigurationImpl config() throws IOException, IdSClientException {
ClassPathResource idsclientResource = new ClassPathResource("idsclient.properties");
IdSClientConfigurationImpl config = new IdSClientConfigurationImpl(idsclientResource.getFile().getPath());
// IdSClientConfigurationImpl config = new IdSClientConfigurationImpl("src/main/resources/idsclient.properties");
config.load();
return config;
}
@Bean
public IdSClient setupIdsClient() throws IOException, IdSClientException {
IdSClient client = IdSClientFactory.getIdSClient();
client.setTLSContext(createSSLTrustManager(), createHostnameVerifier());
// client.setTLSContext(arg0, arg1) // use secure trust manager and hostname verifier in production
client.init(config);
return client;
}
private X509TrustManager createSSLTrustManager() {
X509TrustManager tm = new TrustAllX509TrustManager();
return tm;
}
private HostnameVerifier createHostnameVerifier() {
HostnameVerifier hv = new SkipAllHostNameVerifier();
return hv;
}
推荐阅读
- mongodb - MongoDB (mongoose) - 对文档中的类别和子类别进行分组
- python-3.x - 具有动态 PostgreSQL 架构的 SQLAlchemy ForeignKey
- javascript - 如何使线性渐变跟随 html 中范围滑块的拇指
- sql - 我在 Oracle Apex ORA-00907 上遇到错误:缺少右括号
- c++ - C++ 警告:使用未使用的参数覆盖虚函数
- vue.js - VueJS:在 v-if 中直接改变 prop 与 this.[prop]
- css - CSS中数字的有效范围是多少
- python-3.x - 如何使用千位分隔符格式化 plt.axhline 标签?
- r - 比较 R 中两个统计检验之间的功效
- python - 如何调用或导入python类文件