You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:14:49