Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我们知道用户名/密码时,如何从Java/Scala进行OAuth身份验证?_Java_Scala_Oauth 2.0_Pocket - Fatal编程技术网

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

当我们知道用户名/密码时,如何从Java/Scala进行OAuth身份验证?,java,scala,oauth-2.0,pocket,Java,Scala,Oauth 2.0,Pocket,tl;dr-我想通过Java/Scala的桌面应用程序(不想打开浏览器)使用我自己的用户名/密码对OAuth 2.0 API进行身份验证 为什么??我想使用我自己的凭据从Java/Scala进行身份验证,并获取我的未读项目。这是一个个人命令行工具,我不打算发布供一般使用。他们以前有一个很好的密码,但他们不赞成它,并引入了OAuth 2.0,我不知道如何做我想要的了。有一种称为密码的机架类型,必须启用它,然后您的令牌URL将是这样的 /oauth/token?grant_type=password

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


为什么??我想使用我自己的凭据从Java/Scala进行身份验证,并获取我的未读项目。这是一个个人命令行工具,我不打算发布供一般使用。他们以前有一个很好的密码,但他们不赞成它,并引入了OAuth 2.0,我不知道如何做我想要的了。

有一种称为密码的机架类型,必须启用它,然后您的令牌URL将是这样的

/oauth/token?grant_type=password&username=&password=
标头包含客户端id和密码作为基本身份验证
检查这个

上次我不得不这么做(Facebook登录),我自己已经使用并快速实现了OAuth 2.0所需的部分,这非常简单和快速,多亏了dispatch


现在,在Scala标准库中集成了JSON解析,实现应该只不过是对他们在您提供的链接下编写的内容进行黑客攻击。

好的,因此,如果先做一些事情,这是可能的。您需要先向pocket注册应用程序才能获得消费者密钥。您可以在此处执行此操作:

然后,在下面的链接中手动执行步骤2和步骤3,使您的新应用一次性获得pocket帐户的批准。这是一个一次性的手动步骤,之后可以实现自动化。我在第2步中使用了curl,在第3步中使用了我的浏览器(chrome):

然后,您需要找到您的pocket用户id值。对我来说,它是在一个绑定到域“getpocket.com”的cookie中,名为sess_user_id。使用您的消费者密钥和用户if,您可以使用以下代码获取用于调用pocket的身份验证令牌。请注意,我使用dispatch 0.10.0和spray json 1.2.3作为第三方LIB:

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)
  }

}
导入分派_
导入spray.json_
导入scala.concurrent.ExecutionContext
导入java.util.concurrent.Executors
导入scala.concurrent.Await
导入scala.concurrent.duration_
导入com.ning.http.client.Cookie
案例类CodeRequest(消费者密钥:String,重定向uri:String=“伪:uri”)
对象代码请求
案例类代码响应(代码:字符串)
对象代码响应
案例类AuthRequest(消费者密钥:字符串,代码:字符串)
对象身份验证请求
案例类AuthResponse(访问令牌:字符串,用户名:字符串)
对象身份验证响应
对象PocketJsonProtocol扩展了DefaultJsonProtocol{
隐式val codeRequestFormat=jsonFormat2(CodeRequest.apply)
隐式val codeResponseFormat=jsonFormat1(CodeResponse.apply)
隐式val authRequestFormat=jsonFormat2(AuthRequest.apply)
隐式val authResponseFormat=jsonFormat2(AuthResponse.apply)
}
对象PocketAuth{
导入PocketJsonProtocol_
val JsonHeaders=Map(“X-Accept”->“application/json”,“Content Type”->“application/json;charset=UTF-8”)
隐式val EC=ExecutionContext.fromExecutor(Executors.newCachedThreadPool())
def身份验证(consumerKey:String,userId:String)={
val fut=用于{

codeResp如果你已经为你的帐户手动批准了你的应用程序1次,那么它可能会工作。如果你能满足这个先决条件,那么我想我可以为你编写一个解决方案。为什么-1这种方式是测试和工作检查这个链接也许,因为它必须被启用,因为它被认为是一个不安全和不好的做法我只是在做测试关于密码流检查,您能更明确地说明现在集成在Scala标准库部分的JSON解析吗?我说的是
Scala.util.parsing.JSON
now
指的是当时我使用的是Lift的JSON解析器。我不知道所述包中的解析器的复杂程度。这是否意味着每次需要使用应用程序时,您都需要手动执行授权步骤3?