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

如何在Scala中使用Refresh Token获取OAuth 2.0访问令牌

在Scala中用Refresh Token获取OAuth 2.0 Access Token

1. 添加HTTP客户端依赖

先给项目配上合适的HTTP客户端库,这里以轻量易用的requests-scala为例,在SBT中添加依赖:

libraryDependencies += "com.lihaoyi" %% "requests" % "0.8.0"

2. 构造请求并发送

OAuth 2.0刷新流程的核心是向授权服务器的token端点发送POST请求,携带指定参数。以下是完整代码示例:

import requests.Response

object RefreshTokenHandler extends App {
  // 替换为你的OAuth服务实际参数
  val tokenEndpoint = "https://your-auth-server.com/oauth2/token"
  val clientId = "your-client-id"
  val clientSecret = "your-client-secret"
  val refreshToken = "your-valid-refresh-token"
  // 可选:指定刷新后的权限范围,和初始授权保持一致即可
  val scope = "read write"

  try {
    // 发送POST请求,以表单形式提交参数
    val response: Response = requests.post(
      url = tokenEndpoint,
      data = Map(
        "grant_type" -> "refresh_token",
        "refresh_token" -> refreshToken,
        "client_id" -> clientId,
        "client_secret" -> clientSecret,
        "scope" -> scope
      )
    )

    // 处理成功响应
    if (response.statusCode == 200) {
      val jsonResp = response.json
      val accessToken = jsonResp("access_token").as[String]
      val expiresIn = jsonResp("expires_in").as[Int]
      // 部分服务会返回新的refresh token,建议替换旧的
      val newRefreshToken = jsonResp.get("refresh_token").map(_.as[String])

      println(s"新Access Token: $accessToken")
      println(s"有效期: $expiresIn 秒")
      newRefreshToken.foreach(rt => println(s"新Refresh Token: $rt"))
    } else {
      // 处理错误响应
      val errorMsg = jsonResp("error_description").asOpt[String].getOrElse("未知错误")
      println(s"刷新失败: ${response.statusCode} - $errorMsg")
    }
  } catch {
    case e: Exception => println(s"请求异常: ${e.getMessage}")
  }
}

关键注意事项

  • Client认证方式:部分授权服务器要求通过Authorization头传递client_id和client_secret(Basic认证),而非表单参数。这种情况需要修改请求头:
    val authHeader = "Basic " + java.util.Base64.getEncoder.encodeToString(s"$clientId:$clientSecret".getBytes)
    requests.post(
      url = tokenEndpoint,
      headers = Map("Authorization" -> authHeader),
      data = Map(
        "grant_type" -> "refresh_token",
        "refresh_token" -> refreshToken,
        "scope" -> scope
      )
    )
    
  • Refresh Token有效性:如果refresh token过期或被吊销,服务器会返回invalid_grant错误,此时需要引导用户重新登录授权。
  • JSON解析:示例用了requests-scala自带的简易JSON解析,你也可以用circe、play-json等专业库来处理复杂响应结构。

内容的提问来源于stack exchange,提问作者rakesh singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:10:37