swift - 尝试在 ios 中使用 Firebase Twitter 身份验证获取 Twitter 的访问令牌
问题描述
这是用于登录 Twitter 帐户的代码。我能够登录并被重定向到应用程序,但我无法检索正确的访问令牌(如 twitter api 页面上所说的不记名令牌)。我得到一个包含访问令牌的 AuthDataResult,但是当用于进行 api 调用时它不起作用。
final class AuthManager{
var isSignedIn:Bool{
return firebase.currentUser != nil
}
static let shared = AuthManager()
var provider:OAuthProvider?
let firebase = Auth.auth()
public func handleAuthentication(){
provider = OAuthProvider(providerID: "twitter.com")
provider?.getCredentialWith(nil) { (credential, err) in
if err != nil {
}
guard let cred = credential else {return}
self.firebase.signIn(with: cred) { (data, err) in
if err != nil {
print(err?.localizedDescription as Any)
}
if data != nil {
let newCred:OAuthCredential = data?.credential as! OAuthCredential
print(newCred.accessToken)
print(newCred.idToken) //-> nil
print(newCred.secret)
}
}
}
我使用访问令牌进行 api 调用,但收到错误消息,提示未经授权的调用。
func getTweet(accessToken:String){
guard let apiUrl = URL(string: "https://api.twitter.com/2/tweets/1261326399320715264") else {return}
var request = URLRequest(url: apiUrl)
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
request.httpMethod = "GET"
request.timeoutInterval = 30
let task = URLSession.shared.dataTask(with: request) { (data, res, err) in
guard let data = data else {return}
do{
let resutl = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
print(resutl)
}
catch{
print(error.localizedDescription)
}
}
task.resume()
}
解决方案
不记名令牌不同于用户访问令牌。当前版本的 Twitter API 中的不记名令牌用于验证应用程序上下文,其生成方式与用户访问令牌不同。Firebase 登录通常用于获取用户访问令牌,该令牌对用户进行身份验证。您不能互换使用这些值,这就是您在尝试调用 API 时遇到身份验证错误的原因。
您可以通过将使用者密钥和秘密(也称为 API 密钥和秘密)传递给 Twitter API 来获取不记名令牌,如下所示(使用 curl 的示例)
curl -u "$CONSUMER_KEY:$CONSUMER_SECRET" --data 'grant_type=client_credentials' 'https://api.twitter.com/oauth2/token'
推荐阅读
- xml - 从 libreoffice calc 导出到 xml 时如何保留换行符?
- javascript - 有没有办法制作“for循环的for循环”?
- javascript - 有没有办法在不太详细的日志级别使用 console.time?
- rsync - 如何为 rsync 源和目标定义单独的用户名/密码?
- scala - Spark 流作业以 Json 格式写入 Hdfs
- sql-server - 如何修复“SQL 配置管理器”?
- r - 按行着色数据框
- c++ - 如何在外语和返回共享指针的 C++ 库之间进行接口
- sql - 计算 ID 以获取正确的创建日期时间
- arrays - 在 Julia 中使用巨大数组的有效方法