All Downloads are FREE. Search and download functionalities are using the official Maven repository.

omniauth.lib.KuaipanProvider.scala Maven / Gradle / Ivy

package omniauth.lib

import java.util.Date

import net.liftweb._
import net.liftweb.common.Full
import net.liftweb.http.S
import omniauth.Omniauth
import json.JsonParser

import dispatch.classic._

/**
 * Created by twang on 12/8/2014.
 */
class KuaipanProvider (val key:String, val secret:String) extends OmniauthProvider {
  implicit val formats = net.liftweb.json.DefaultFormats
  def providerName = KuaipanProvider.providerName

  def callbackUrl = Omniauth.siteAuthBaseUrl+"auth/"+providerName+"/callback"

  var temporaryToken = ""
  var temporaryTokenSecret = ""

  // Step 1: get temporary token
  private def getTemporaryToken() = {
    val params = Map(
      "oauth_consumer_key" -> key,
      "oauth_nonce" -> csrf,
      "oauth_signature_method" -> "HMAC-SHA1",
      "oauth_timestamp" -> (new Date().getTime()+"").substring(0, 10),
      "oauth_version" -> "1.0",
      "oauth_callback" -> callbackUrl
    )
    val oauth_signature = generateSignature("GET", "https://openapi.kuaipan.cn/open/requestToken", secret+"&", params)
    val req = :/("openapi.kuaipan.cn").secure / "open/requestToken" < oauth_signature))
    Omniauth.http(req >- JsonParser.parse)
  }

  // Step 2: sign in
  def signIn() = {
    val temporaryTokenResponse = getTemporaryToken()
    temporaryToken = (temporaryTokenResponse \ "oauth_token").extract[String]
    temporaryTokenSecret = (temporaryTokenResponse \ "oauth_token_secret").extract[String]
    val authorizeRequestUrl = "https://www.kuaipan.cn/api.php?ac=open&op=authorise&oauth_token=" + temporaryToken
    S.redirectTo(authorizeRequestUrl)
  }

  // Step 3: get token
  def callback() = {
    execWithStateValidation {
      S.param("oauth_verifier") match {
        case Full(oauth_verifier) => {
          val params = Map(
            "oauth_consumer_key" -> key,
            "oauth_nonce" -> csrf,
            "oauth_signature_method" -> "HMAC-SHA1",
            "oauth_timestamp" -> (new Date().getTime()+"").substring(0, 10),
            "oauth_token" -> temporaryToken,
            "oauth_version" -> "1.0"
          )
          val oauth_signature = generateSignature("GET", "https://openapi.kuaipan.cn/open/accessToken", secret+"&"+temporaryTokenSecret, params)
          val req = :/("openapi.kuaipan.cn").secure / "open/accessToken" < oauth_signature))
          val json = Omniauth.http(req >- JsonParser.parse)
          Omniauth.setAuthInfo(omniauth.AuthInfo(
            providerName,
            (json \ "user_id").extract[String],
            "",
            AuthToken((json \ "oauth_token").extract[String], None, None, Some((json \ "oauth_token_secret").extract[String]))
          ))

          logger.debug("token validated")
          S.redirectTo(Omniauth.successRedirect)
        }
        case _ => {
          logger.debug("code was not returned from Kuaipan")
          S.redirectTo(Omniauth.failureRedirect)
        }
      }
    }
  }

  def validateToken(token:AuthToken) = true // For Kuaipan, don't need to do this step.
  def tokenToId(token:AuthToken) = None // For Kuaipan, don't need to do this step.
}

object KuaipanProvider {
  val providerName = "kuaipan"
  val providerPropertyKey = "omniauth.kuaipankey"
  val providerPropertySecret = "omniauth.kuaipansecret"
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy