我有一个要与Docusign集成的Web应用程序。我正在使用Java docusign客户端。我开始使用OAuth2,但是后来发现刷新令牌已过期,从我阅读的内容来看,用户将不得不再次进行身份验证(每次用户交互)。通常刷新不会过期,但访问令牌会过期。我没看错吗?
我希望用户进行一次身份验证,并使应用程序能够使用该令牌,而无需再次要求用户进行访问。因此,我开始研究JWT,却找不到所需的文档。
使用JWT,我可以获得该帐户的用户信息。但是无法调用模板。
apiClient.configureJWTAuthorizationFlow(folder + "509.cert", folder
+ "509.ppk", "account-d.docusign.com", IntegratorKey, account, 3600 );
com.docusign.esign.client.auth.OAuth.UserInfo userInfo =
apiClient.getUserInfo(apiClient.getAccessToken());
// **** This prints fine *****
System.out.println("UserInfoxxx: " + userInfo);
// **** Verified the url is demo *****
apiClient.setBasePath(userInfo.getAccounts().get(0).getBaseUri() +
"/restapi");
com.docusign.esign.api.TemplatesApi api = new
com.docusign.esign.api.TemplatesApi(apiClient);
try {
com.docusign.esign.model.EnvelopeTemplateResults resp =
api.listTemplates(account);
for ( com.docusign.esign.model.EnvelopeTemplateResult template :
resp.getEnvelopeTemplates() )
{
out.println("X " + template.getDescription() + " " +
template.getName() );
}
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
https://demo.docusign.net/restapi
com.docusign.esign.client.ApiException: Error while requesting server,
received a non successful HTTP code 400 with response Body: '{
"errorCode": "PARTNER_AUTHENTICATION_FAILED",
"message": "The specified Integrator Key was not found or is disabled.
Invalid account specified for user."}'
at com.docusign.esign.client.ApiClient.invokeAPI(ApiClient.java:929)
at
com.docusign.esign.api.TemplatesApi.listTemplates(TemplatesApi.java:2471)
at
com.docusign.esign.api.TemplatesApi.listTemplates(TemplatesApi.java:2409)
我正在使用集成商密钥(客户端ID) 有什么建议或建议吗?
[更新] 是的,我在这里是我的流程。
发送用户到
https://account-d.docusign.com/oauth/auth?response_type=code&scope=signature%20impersonation&client_id=" + IntegratorKey + "&redirect_uri=" + redirectUri + "&state=" + state;
重定向时
String code = request.getParameter("code");
com.docusign.esign.client.auth.OAuth.OAuthToken oAuthToken = apiClient.generateAccessToken(IntegratorKey, ClientSecret, code);
System.out.println("OAuthToken: " + oAuthToken.getAccessToken() );
com.docusign.esign.client.auth.OAuth.UserInfo userInfo = apiClient.getUserInfo(oAuthToken.getAccessToken());
String folder = com.n.util.Settings.getInstance().getRealPath("/") + "META-INF/cert/";
apiClient.configureJWTAuthorizationFlow(folder + "509.cert", folder + "509.ppk", "account-d.docusign.com", IntegratorKey, userInfo.getSub(), oAuthToken.getExpiresIn() );
然后我存储userInfo.getSub()并将其用于其他请求。 我也尝试过使用帐户ID。
答案 0 :(得分:0)
回复:我从使用OAuth2的路径开始,但是后来发现刷新令牌已过期,从我阅读的内容来看,用户将不得不再次进行身份验证(每次用户交互)。
通常刷新不会过期,但访问令牌会过期。
我读得正确吗?
不完全。请按照您最初的计划使用授权代码授予。
这是独家新闻:如果您要求extended
范围(除了signature
范围之外),则返回的刷新令牌将每隔30天有效另一个您的应用使用刷新操作的时间。
示例:
第1天:人工通过您的应用程序使用“授权码授予”流程登录DocuSign。范围请求为signature%20extended
,您的应用程序从DocuSign收到了8个小时的Access Token
货物,而有30天的Refresh Token
货物。您的应用将刷新令牌存储在非易失性存储中。
第23天:人类再次希望将您的应用与DocuSign结合使用。您的应用程序使用其存储的刷新令牌向DocuSign发出刷新令牌请求。 (无需人工干预。)您的应用会收到一个访问令牌,有效期为8个小时,而新 Refresh Token
的有效期为30天(从现在起到53天)。您的应用程序将刷新令牌存储(替换)在非易失性存储中。
结果,只要您的应用至少每30天使用/刷新一次刷新令牌,它将永远拥有一个DocuSign刷新令牌可用于获取访问令牌,而无需人工干预需要。
注意事项由DocuSign客户或DocuSign本身发起的安全问题可能导致刷新和/或访问令牌不再有效,因此要求用户手动向DocuSign进行身份验证。但这将是意外事件,并且还会影响通过JWT身份验证流获得的访问令牌。
请在需要的情况下保留JWT流程。 JWT流程使您的应用能够模拟用户。这是更高级别的访问,因此,如果有很好的选择,则不应使用。如果用户在场,则建议使用授权码授予。
解决有关JWT流程的问题:试用我们新的Java JWT example来看看是否有帮助。