如何在JVM的Kotlin应用中利用现有库实现Adobe Commerce REST API的OAuth 1.0a身份验证(使用集成密钥)
如何在JVM的Kotlin应用中利用现有库实现Adobe Commerce REST API的OAuth 1.0a身份验证(使用集成密钥)
我太懂你这种困扰了——之前试过的ScribeJava、Apache Signpost要么把OAuth参数硬塞在URL里不符合Adobe的要求,要么版本太老没人维护,不想自己从零写签名逻辑又怕踩坑对吧?别担心,有两个靠谱的方案能解决你的问题,不用自己造轮子。
方案一:用ScribeJava配置Header模式的OAuth 1.0a认证
你之前可能没注意到,ScribeJava其实支持把OAuth参数放在Authorization请求头里,而且它的维护状态还算活跃,最近几年都有版本更新,比停更已久的Signpost靠谱多了。
步骤1:添加依赖
在你的build.gradle.kts(或Maven的pom.xml)里引入ScribeJava的核心包和API包:
dependencies { implementation("com.github.scribejava:scribejava-core:8.3.3") implementation("com.github.scribejava:scribejava-apis:8.3.3") }
步骤2:编写Kotlin实现代码
我们需要自定义Adobe的OAuth服务实现,重点是指定签名策略为Header模式,这样就能让ScribeJava自动把所有OAuth认证信息塞进Authorization头里,完全符合Adobe的要求:
import com.github.scribejava.core.builder.ServiceBuilder import com.github.scribejava.core.model.OAuth1AccessToken import com.github.scribejava.core.model.OAuthRequest import com.github.scribejava.core.model.Verb import com.github.scribejava.core.oauth.OAuth10aService fun main() { // 替换成你在Adobe Admin后台创建的集成密钥信息 val apiKey = "你的Adobe集成API Key" val apiSecret = "你的Adobe集成API Secret" val accessToken = "你的Adobe访问Token" val accessTokenSecret = "你的Adobe访问Token Secret" val targetApiUrl = "https://你的Adobe Commerce域名/rest/V1/products" // 示例API接口 // 自定义Adobe OAuth服务,强制使用Header签名模式 val adobeOAuthService = ServiceBuilder(apiKey) .apiSecret(apiSecret) .build(object : com.github.scribejava.apis.DefaultApi10a() { override fun getAccessTokenEndpoint(): String = "" override fun getRequestTokenEndpoint(): String = "" override fun getAuthorizationUrl(oAuth1RequestToken: OAuth1AccessToken): String = "" // 关键配置:指定签名信息放在Authorization Header中 override fun getSignatureType(): SignatureType = SignatureType.Header }) // 构建请求并自动完成OAuth签名 val request = OAuthRequest(Verb.GET, targetApiUrl) adobeOAuthService.signRequest(OAuth1AccessToken(accessToken, accessTokenSecret), request) // 发送请求并处理响应 val response = adobeOAuthService.execute(request) println("响应状态码: ${response.code}") println("响应内容: ${response.body}") }
方案二:用OkHttp搭配OAuth 1.0a拦截器
如果你平时习惯用OkHttp作为HTTP客户端,这个方案会更顺手——给OkHttp加一个拦截器,就能自动处理所有OAuth签名和请求头的生成,完全不用手动干预。
步骤1:添加依赖
引入OkHttp、维护版的Signpost以及对应的OkHttp拦截器:
dependencies { implementation("com.squareup.okhttp3:okhttp:4.12.0") implementation("com.github.kevinsawicki:oauth-signpost:1.2.1.2") // Signpost的维护分支 implementation("se.akerfeldt:okhttp-signpost:1.1.0") }
步骤2:编写Kotlin实现代码
配置好OAuth消费者和拦截器后,所有通过这个OkHttp客户端发送的请求都会自动带上符合要求的Authorization头:
import okhttp3.OkHttpClient import okhttp3.Request import se.akerfeldt.okhttp.signpost.OkHttpOAuthConsumer import se.akerfeldt.okhttp.signpost.SigningInterceptor fun main() { // 替换成你的Adobe集成密钥信息 val consumer = OkHttpOAuthConsumer( "你的Adobe集成API Key", "你的Adobe集成API Secret" ) consumer.setTokenWithSecret( "你的Adobe访问Token", "你的Adobe访问Token Secret" ) // 给OkHttp客户端添加签名拦截器 val okHttpClient = OkHttpClient.Builder() .addInterceptor(SigningInterceptor(consumer)) .build() // 构建并发送请求 val request = Request.Builder() .url("https://你的Adobe Commerce域名/rest/V1/orders") // 示例API接口 .build() okHttpClient.newCall(request).execute().use { response -> if (!response.isSuccessful) throw RuntimeException("请求失败:$response") println("响应内容: ${response.body?.string()}") } }
这两个方案都完全不需要你自己写签名逻辑,也能严格符合Adobe要求的Authorization头认证方式,而且用到的库都是目前还在维护(或有活跃分支)的版本,不用担心过时问题。
备注:内容来源于stack exchange,提问作者Adavis
相关产品推荐
相关产品推荐

