forked from ghostm/lift-omniauth
/
Omniauth.scala
executable file
·197 lines (166 loc) · 7.98 KB
/
Omniauth.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
package omniauth
/*
* Copyright 2010-2011 Matthew Henderson
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import omniauth.lib._
import dispatch.classic._
import oauth._
import net.liftweb.http._
import net.liftweb.sitemap.{Menu, Loc}
import Loc._
import net.liftweb.common._
import org.apache.http.client.utils.URLEncodedUtils
import org.apache.http.message.BasicNameValuePair
object Omniauth extends Omniauth
trait Omniauth {
val logger = Logger("omniauth.Omniauth")
/**
* If in GAE, add dependency to net.databinder:dispatch-gae and override this.
* {{{
* if (Props.inGAE) { new dispatch.gae.Http } else { new Http }
* }}}
*/
val http = new Http
var TwitterHost = :/("api.twitter.com").secure
val twitterOauthRequest = TwitterHost / "oauth"
var successRedirect = "/"
var failureRedirect = "/"
var providers:List[OmniauthProvider] = List[OmniauthProvider]()
var siteAuthBaseUrl = "http://0.0.0.0:8080/"
private object curRequestToken extends SessionVar[Box[Token]](Empty)
def currentRequestToken: Box[Token] = curRequestToken.is
def setRequestToken(tok:Token){
curRequestToken(Full(tok))
}
private object curAccessToken extends SessionVar[Box[Token]](Empty)
def currentAccessToken: Box[Token] = curAccessToken.is
def setAccessToken(tok:Token){ curAccessToken(Full(tok)) }
private object authInfo extends SessionVar[Box[AuthInfo]](Empty)
def currentAuth: Box[AuthInfo] = authInfo.is
def setAuthInfo(ai:AuthInfo){authInfo(Full(ai))}
def clearCurrentAuth = authInfo(Empty)
private object returnUrlInfo extends SessionVar[Box[String]](Empty)
def returnTo:Box[String] = returnUrlInfo
def setReturnTo(url:String):Unit = returnUrlInfo(Full(url))
def clearReturnTo = returnUrlInfo(Empty)
private def providerListFromProperties():List[OmniauthProvider] = {
List(getProviderFromProperties(FacebookProvider.providerName, FacebookProvider.providerPropertyKey, FacebookProvider.providerPropertySecret),
getProviderFromProperties(GithubProvider.providerName, GithubProvider.providerPropertyKey, GithubProvider.providerPropertySecret),
getProviderFromProperties(TwitterProvider.providerName, TwitterProvider.providerPropertyKey, TwitterProvider.providerPropertySecret),
getProviderFromProperties(MSLiveProvider.providerName, MSLiveProvider.providerPropertyKey, MSLiveProvider.providerPropertySecret),
getProviderFromProperties(DropboxProvider.providerName, DropboxProvider.providerPropertyKey, DropboxProvider.providerPropertySecret),
getProviderFromProperties(KuaipanProvider.providerName, KuaipanProvider.providerPropertyKey, KuaipanProvider.providerPropertySecret),
getProviderFromProperties(GoogleProvider.providerName, GoogleProvider.providerPropertyKey, GoogleProvider.providerPropertySecret),
getProviderFromProperties(LinkedinProvider.providerName, LinkedinProvider.providerPropertyKey, LinkedinProvider.providerPropertySecret),
getProviderFromProperties(InstagramProvider.providerName, InstagramProvider.providerPropertyKey,
InstagramProvider.providerPropertySecret),
getProviderFromProperties(VKProvider.providerName, VKProvider.providerPropertyKey, VKProvider.providerPropertySecret)
).flatten(a => a)
}
private def getProviderFromProperties(providerName:String, providerKey:String, providerSecret:String):Box[OmniauthProvider] = {
Properties.get(providerKey) match {
case Full(pk) => Properties.get(providerSecret) match {
case Full(ps) => {
providerName match {
case TwitterProvider.providerName => Full(new TwitterProvider(pk, ps))
case FacebookProvider.providerName => Full(new FacebookProvider(pk, ps))
case GithubProvider.providerName => Full(new GithubProvider(pk, ps))
case MSLiveProvider.providerName => Full(new MSLiveProvider(pk, ps))
case DropboxProvider.providerName => Full(new DropboxProvider(pk, ps))
case KuaipanProvider.providerName => Full(new KuaipanProvider(pk, ps))
case GoogleProvider.providerName => Full(new GoogleProvider(pk, ps))
case LinkedinProvider.providerName => Full(new LinkedinProvider(pk, ps))
case InstagramProvider.providerName => Full(new InstagramProvider(pk, ps))
case VKProvider.providerName => Full(new VKProvider(pk, ps))
case _ => {
logger.warn("no provider found for "+providerName)
Empty
}
}
}
case Empty => logger.warn("getProviderFromProperties: empty secret"); Empty
case Failure(_,_,_) => logger.warn("getProviderFromProperties: fail secret"); Empty
}
case Empty => logger.info("getProviderFromProperties:" + providerKey + " empty key"); Empty
case Failure(_,_,_) => logger.warn("getProviderFromProperties: fail key"); Empty
}
}
private def commonInit = {
ResourceServer.allow({
case "img" :: img => true
})
siteAuthBaseUrl = Properties.get("omniauth.baseurl") openOr "http://0.0.0.0:8080/"
successRedirect = Properties.get("omniauth.successurl") openOr "/"
failureRedirect = Properties.get("omniauth.failureurl") openOr "/"
LiftRules.addToPackages("omniauth")
//Omniauth request rewrites
LiftRules.statelessRewrite.prepend {
case RewriteRequest(ParsePath(List("auth", providerName, "signin"), _, _, _), _, _) =>
RewriteResponse("omniauth"::"signin" :: Nil, Map("provider" -> providerName))
}
LiftRules.statelessRewrite.prepend {
case RewriteRequest(ParsePath(List("auth", providerName, "callback"), _, _, _), _, _) =>
RewriteResponse("omniauth"::"callback":: Nil, Map("provider" -> providerName))
}
}
def init = {
providers = providerListFromProperties()
if(providers.size > 0)
logger.info("Configured "+providers.size+" providers: "+providers.map(_.providerName))
else
logger.warn("No providers were configured for Omniauth!")
commonInit
}
def initWithProviders(newProviders:List[OmniauthProvider]) = {
providers = newProviders
commonInit
}
def callbackMenuLoc: Box[Menu] =
Full(Menu(Loc("AuthCallback", List("omniauth","callback"), "AuthCallback", Hidden)))
def signinMenuLoc: Box[Menu] =
Full(Menu(Loc("AuthSignin", List("omniauth", "signin"), "AuthSignin", Hidden)))
lazy val sitemap: List[Menu] =
List(callbackMenuLoc, signinMenuLoc).flatten(a => a)
def validateToken(provider:String, token:AuthToken): Boolean = {
Omniauth.providers.foreach(p => {
if(p.providerName.equalsIgnoreCase(provider)){
return p.validateToken(token)
}
})
false
}
def tokenToId(provider:String, token:AuthToken): Box[String] = {
Omniauth.providers.foreach(p => {
if(p.providerName.equalsIgnoreCase(provider)){
return p.tokenToId(token)
}
})
Empty
}
def map2ee(values: Map[String, Any]) = java.util.Arrays asList (
values.toSeq map { case (k, v) => new BasicNameValuePair(k, v.toString) } toArray : _*
)
def q_str (values: Map[String, Any]) = URLEncodedUtils.format(map2ee(values), Request.factoryCharset)
}
case class AuthInfo(provider:String,
uid:String,
name:String,
token:AuthToken,
secret:Option[String] = None,
nickName:Option[String] = None,
email:Option[String] = None,
firstName:Option[String]=None,
lastName:Option[String]=None,
extraData:Option[Map[String, Any]]=None)