2013-05-09 4 views
1

Heroku에서 스칼라로 취미 프로젝트를 작성 중입니다. 현재 http 기본 인증을 사용하는 자체 인증 메커니즘이 있습니다. 나는 사람들의 기존 신임 정보를 예를 들어서 사용할 수 있기를 바랍니다. 대신 구글이나 페이스 북. Ruby의 경우 트릭을 수행해야하는 omniauth가 있다는 것을 알고 있습니다. Heroku에서 작동하는 Scala와 동일한 솔루션이 있습니까? Scalatra를 웹 스택으로 사용하고 있습니다.스칼라 : Heroku에서 openID를 통해 내 애플리케이션에 대한 액세스 제어를 제공하기 위해 google/facebook 자격 증명을 사용하는 방법

답변

1

본인은 절대로 사용하지 않았지만 socialauth 라이브러리를보고 싶습니다.

+0

감사합니다! 내 목적을 위해 조금 너무 좋아, 대신 openid4java 함께 갈거야. – auramo

0

이제 최소한 openid4java으로 해킹했습니다. 문서 작성은 좋지 않지만 Google 계정으로 로그인 할 수있었습니다.

package auth 

import org.openid4java.discovery.Identifier 
import org.openid4java.discovery.DiscoveryInformation 
import org.openid4java.message.ax.FetchRequest 
import org.openid4java.message.ax.FetchResponse 
import org.openid4java.message.ax.AxMessage 
import org.openid4java.message._ 
import javax.servlet.http.HttpServletRequest 
import javax.servlet.http.HttpServletResponse 
import java.util.List 
import org.openid4java.consumer.{VerificationResult, ConsumerManager} 

case class AuthenticatedUser(identifier: Identifier, email: Option[String]) 

class OpenIdConsumer { 
    val manager: ConsumerManager = new ConsumerManager 

    def authenticateGoogleUser(request: HttpServletRequest, response: HttpServletResponse) { 
    val googleOpenIdRequestString = "https://www.google.com/accounts/o8/id" 
    val returnToUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/openid" 
    authRequest(googleOpenIdRequestString, returnToUrl, request, response) 
    } 

    def authRequest(userSuppliedString: String, returnToUrl: String, httpReq: HttpServletRequest, httpResp: HttpServletResponse) { 
    val discoveries = manager.discover(userSuppliedString) 
    val discovered = manager.associate(discoveries) 
    httpReq.getSession.setAttribute("openid-disc", discovered) 
    val authReq = manager.authenticate(discovered, returnToUrl) 
    val fetch = FetchRequest.createFetchRequest 
    fetch.addAttribute("email", "http://schema.openid.net/contact/email", true) 
    authReq.addExtension(fetch) 
    httpResp.sendRedirect(authReq.getDestinationUrl(true)) 
    } 

    def verifyResponse(httpReq: HttpServletRequest): Either[String, AuthenticatedUser] = { 
    try { 
     doVerifyResponse(httpReq) 
    } 
    catch { 
     case e: Exception => { 
     e.printStackTrace 
     Left(e.getMessage) 
     } 
    } 
    } 

    private def doVerifyResponse(httpReq: HttpServletRequest): Either[String, AuthenticatedUser] = { 
    val response: ParameterList = new ParameterList(httpReq.getParameterMap) 
    val discovered: DiscoveryInformation = httpReq.getSession.getAttribute("openid-disc").asInstanceOf[DiscoveryInformation] 
    val receivingURL: StringBuffer = httpReq.getRequestURL 
    val queryString: String = httpReq.getQueryString 
    if (queryString != null && queryString.length > 0) receivingURL.append("?").append(httpReq.getQueryString) 
    val verification: VerificationResult = manager.verify(receivingURL.toString, response, discovered) 
    val verified: Identifier = verification.getVerifiedId 
    if (verified != null) { 
     val authSuccess: AuthSuccess = verification.getAuthResponse.asInstanceOf[AuthSuccess] 
     if (authSuccess.hasExtension(AxMessage.OPENID_NS_AX)) { 
     val fetchResp: FetchResponse = authSuccess.getExtension(AxMessage.OPENID_NS_AX).asInstanceOf[FetchResponse] 
     val emails: List[_] = fetchResp.getAttributeValues("email") 
     val email: String = emails.get(0).asInstanceOf[String] 
     return Right(AuthenticatedUser(verified, Some(email))) 
     } 
     return Right(AuthenticatedUser(verified, None)) 
    } 
    Left("Not authenticated") 
    } 
} 

을 그리고 내 서블릿은 지금 테스트하는 이러한 엔트리 포인트가 포함되어 있습니다 :

여기에 내 서블릿에서 사용하는 코드는

val consumer = new OpenIdConsumer 
    ... 

    get("/authenticate") { 
    consumer.authenticateGoogleUser(request, response) 
    } 


    get("/openid") { 
    val retval = consumer.verifyResponse(request) 
    println("retval: " + retval) 
    <html> 
     <body> 
     <h1>Openid return page</h1> 
     </body> 
    </html> 
    }