HexavilleAuth 是一个用于 Hexaville 的身份验证(OAuth,基于简单密码)框架。
HexavilleAuth 认识到每个应用程序都有独特的身份验证需求。它允许将单独的身份验证机制打包为插件,并由其使用。
插件的范围可以从简单的基于密码的身份验证,到使用 OAuth 的身份验证(通过 Facebook、Github OAuth 提供商等)。
HexavilleAuth 为每个 SNS 平台自动创建授权/回调资源,因此您可以非常快速地将 SNS 身份验证功能嵌入到您的 Hexaville 应用程序中。
只需将 .Package(url: "https://github.com/Hexaville/HexavilleAuth.git", majorVersion: 0, minor: 1)
添加到您的 Package.swift 中
import PackageDescription
let package = Package(
name: "MyHexavilleApplication",
dependencies: [
.Package(url: "https://github.com/Hexaville/HexavilleAuth.git", majorVersion: 0, minor: 1)
]
)
这是一个使用 HexavilleFramework 进行 Facebook OAuth 授权的示例代码
import Foundation
import HexavilleAuth
import HexavilleFramework
let app = HexavilleFramework()
var auth = HexavilleAuth()
let APP_URL = ProcessInfo.processInfo.environment["APP_URL"] ?? "https://:3000"
let facebookProvider = FacebookAuthorizationProvider(
path: "/auth/facebook",
consumerKey: ProcessInfo.processInfo.environment["FACEBOOK_APP_ID"] ?? "",
consumerSecret: ProcessInfo.processInfo.environment["FACEBOOK_APP_SECRET"] ?? "",
callbackURL: CallbackURL(baseURL: APP_URL, path: "/auth/facebook/callback"),
scope: "public_profile"
) { credential, user, request, context in
// here is called when the access_token got successfully from sns.
return Response(body: "\(user)")
}
auth.add(facebookProvider)
app.use(auth)
app.catch { error in
switch error {
case HexavilleAuthError.responseError(let response):
return Response(body: response.body.asData())
default:
return Response(body: "\(error)")
}
}
try app.run()
如果您注册了 HexavilleAuth.AuthenticationMiddleware
并且 loginUser 信息存储在会话中,则可以从 ApplicationContext
中以 LoginUser
对象的形式获取它。
public struct LoginUser {
public let id: String
public let name: String
public let screenName: String?
public let email: String?
public let picture: String?
public let raw: [String: Any]
}
import Foundation
import HexavilleAuth
import HexavilleFramework
let app = HexavilleFramework()
var auth = HexavilleAuth()
let APP_URL = ProcessInfo.processInfo.environment["APP_URL"] ?? "https://:3000"
let twitterProvider = TwitterAuthorizationProvider(
path: "/auth/twitter",
consumerKey: ProcessInfo.processInfo.environment["TWITTER_APP_ID"] ?? "",
consumerSecret: ProcessInfo.processInfo.environment["TWITTER_APP_SECRET"] ?? "",
callbackURL: CallbackURL(baseURL: APP_URL, path: "/auth/twitter/callback"),
scope: ""
) { credential, user, request, context in
return Response(body: "\(user)")
}
app.use(HexavilleAuth.AuthenticationMiddleware()) // register to get loginUser Object
app.use { req, context in
print(context.isAuthenticated()) // => true
print(context.loginUser) // Get the loginUser object
return .next(req)
}
auth.add(twitterProvider)
app.use(auth)
try app.run()
git clone https://github.com/Hexaville/HexavilleAuth.git
cd HexavilleAuth
cd swift build
./.build/debug/HexavilleAuthExample
# => Hexaville Builtin Server started at 0.0.0.0:3000
尝试访问以下资源,以使用浏览器进行身份验证/授权!
您可以使用 OAuthXAuthorizationProvidable
/ AuthenticationProvidable
创建自定义的授权/身份验证提供程序
public protocol OAuth2AuthorizationProvidable {
var path: String { get } // path for authorize
var oauth: OAuth2 { get }
var callback: RespodWithCredential { get } // callback for success handler
init(path: String, consumerKey: String, consumerSecret: String, callbackURL: CallbackURL, scope: String, callback: @escaping RespodWithCredential)
func getAccessToken(request: Request) throws -> Credential
}
这是一个 Salesforce 授权的示例。
public struct SalesforceAuthorizationProvider: OAuth2AuthorizationProvidable {
public let path: String
public let oauth: OAuth2
public let callback: RespodWithCredential
public init(path: String, consumerKey: String, consumerSecret: String, callbackURL: CallbackURL, scope: String, callback: @escaping RespodWithCredential) {
self.path = path
self.oauth = OAuth2(
consumerKey: consumerKey,
consumerSecret: consumerSecret,
authorizeURL: "https://login.salesforce.com/services/oauth2/authorize",
accessTokenURL: "https://login.salesforce.com/services/oauth2/token",
callbackURL: callbackURL,
scope: scope
)
self.callback = callback
}
}
使用它!
var auth = HexavilleAuth()
let salesforceProvider = SalesforceAuthorizationProvider(
path: "/auth/salesforce",
consumerKey: "consumer",
consumerSecret: "secret",
callbackURL: CallbackURL(baseURL: APP_URL, path: "/auth/salesforce/callback"),
scope: "public_profile"
) { credential, user, request, context in
try DB.save(token: credential.accessToken)
return Response(body: "\(user)")
}
auth.add(salesforceProvider)
HexavilleAuth 在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE。