gpt4 book ai didi

java - 当我们知道用户名/密码时,如何从 Java/Scala 进行 OAuth 身份验证?

转载 作者:行者123 更新时间:2023-11-30 07:17:23 25 4
gpt4 key购买 nike

tl;dr - 我想通过来自 Java/Scala 的桌面应用程序(不想打开浏览器)使用我自己的用户名/密码针对 OAuth 2.0 API 进行身份验证。

为什么?我想使用 Pocket's v3 API 进行身份验证从 Java/Scala 使用我自己的凭据获取我的未读项目。这是我不打算发布供一般使用的个人命令行工具。他们曾经有一个很好的basic-auth API但他们弃用了它并引入了 OAuth 2.0,我不确定如何再做我想做的事了。

最佳答案

好吧,事实证明这是可能的,前提是先准备好一些东西。您需要先使用 Pocket 注册一个应用程序才能获得用户 key 。您可以在此处执行此操作:

http://getpocket.com/developer/apps/new

然后,手动完成以下链接中的第 2 步和第 3 步,让您的新应用一次性获得口袋账户的批准。这是一个一次性的手动步骤,之后事情可以自动化。我在第 2 步中使用了 curl,在第 3 步中使用了我的浏览器 (chrome):

http://getpocket.com/developer/docs/authentication

然后,您需要找到您的袖珍用户 ID 值。对我来说,它位于与域“getpocket.com”相关联的 cookie 中,名称为 sess_user_id。有了您的消费者 key 和用户 if,您就可以使用以下代码来获取用于调用 pocket 的授权 token 。请注意,我使用 dispatch 0.10.0 和 spray-json 1.2.3 作为第 3 方库:

import dispatch._
import spray.json._
import scala.concurrent.ExecutionContext
import java.util.concurrent.Executors
import scala.concurrent.Await
import scala.concurrent.duration._
import com.ning.http.client.Cookie

case class CodeRequest(consumer_key:String, redirect_uri:String = "fake:uri")
object CodeRequest
case class CodeResponse(code:String)
object CodeResponse

case class AuthRequest(consumer_key:String, code:String)
object AuthRequest
case class AuthResponse(access_token:String, username:String)
object AuthResponse

object PocketJsonProtocol extends DefaultJsonProtocol {
implicit val codeRequestFormat = jsonFormat2(CodeRequest.apply)
implicit val codeResponseFormat = jsonFormat1(CodeResponse.apply)
implicit val authRequestFormat = jsonFormat2(AuthRequest.apply)
implicit val authResponseFormat = jsonFormat2(AuthResponse.apply)
}

object PocketAuth {
import PocketJsonProtocol._
val JsonHeaders = Map("X-Accept" -> "application/json", "Content-Type" -> "application/json; charset=UTF-8")
implicit val EC = ExecutionContext.fromExecutor(Executors.newCachedThreadPool())

def authenticate(consumerKey:String, userId:String) = {
val fut = for{
codeResp <- requestCode(consumerKey)
_ <- activateToken(codeResp, userId)
authResp <- requestAuth(consumerKey, codeResp)
} yield{
JsonParser(authResp).convertTo[AuthResponse]
}

val auth = Await.result(fut, 5 seconds)
auth.access_token
}

def requestCode(key:String) = {
val req = url("https://getpocket.com/v3/oauth/request") <:< JsonHeaders << CodeRequest(key).toJson.toString
Http(req.POST OK as.String).map(JsonParser(_).convertTo[CodeResponse])
}

def activateToken(codeResp:CodeResponse, userId:String) = {
val req = (url("https://getpocket.com/auth/authorize") <<? Map("request_token" -> codeResp.code, "redirect_uri" -> "foo")).addCookie(
new Cookie(".getpocket.com", "sess_user_id", userId, "/", 100, false))
Http(req)
}

def requestAuth(key:String, codeResp:CodeResponse) = {
val req = url("https://getpocket.com/v3/oauth/authorize") <:< JsonHeaders << AuthRequest(key, codeResp.code).toJson.toString
Http(req.POST OK as.String)
}

}

您需要做的就是调用 PocketAuth 对象上的 authenticate 函数,这将返回 String 身份验证 token 。

是不是有点乱?是的,但那是因为他们真的不希望您将此过程自动化,但这是可能的,因为我让它重复工作。

关于java - 当我们知道用户名/密码时,如何从 Java/Scala 进行 OAuth 身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16246440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com