【问题标题】:Github OAuth using Firebase - how to get user's usernameGithub OAuth 使用 Firebase - 如何获取用户的用户名
【发布时间】:2016-12-13 07:25:04
【问题描述】:

我按照 Firebase 关于如何使用 Github 进行身份验证的指南进行操作。 https://firebase.google.com/docs/auth/web/github-auth

Firebase 的 signInWithRedirect 方法的返回结果包含用户的 displayNameemail 等,但它似乎不包含用户的'登录 strong>' 用户名,这是调用 Github 大部分 API 调用的关键。

我确信有办法获得它,但我似乎找不到任何文档。有人碰巧知道如何解决吗?

【问题讨论】:

    标签: firebase oauth-2.0 firebase-authentication


    【解决方案1】:

    我最终使用Github's API 来获取带有 accessToken 的用户名。

    【讨论】:

    • 嘿,已经一年多了,但如果你也能分享代码 sn-p 那就太好了:) 你是否使用了带有电子邮件字段作为搜索项的搜索 API,因为我找不到任何直接 api 来获取给定电子邮件的用户名。
    • 此外,您最初链接的链接已不存在,只是重定向到主 API 页面!
    【解决方案2】:

    您应该能够通过名为“用户名”的参数获取用户的 GitHub 用户名(在此处查看更多信息:https://github.com/firebase/firebase-simple-login/blob/master/docs/v1/providers/github.md

    注意:firebase-simple-login 已于 2014 年 10 月 3 日弃用

    【讨论】:

    • 感谢您的回答,但恐怕存储库已被弃用。我想人们仍然可以使用它来获取“用户名”,但是有没有办法使用 firebase 的新 API 来获取它?顺便说一句,我目前正在关注这里的身份验证指南firebase.google.com/docs/auth/web/github-auth
    • firebase-simple-login 已于 2014 年 10 月 3 日弃用
    【解决方案3】:

    您可以使用从GitHub's api 获取经过身份验证的用户

    或者如果你使用octokit javascript rest api client,你可以这样做

    octokit = new Octokit({auth: userAccessToken }) 
    octokit.users.getAuthenticated()
                            .then(result => {
                                console.log(result.data.login) // this is the username
                            })
    

    注意:你会在 GitHub firebase 登录后获得 accessToken

    希望这有帮助!

    【讨论】:

      【解决方案4】:

      您可以在additionalUserInfo中获取用户名:

      const githubProvider = new firebaseClient.auth.GithubAuthProvider();
      
      githubProvider.addScope('read:user');
      githubProvider.setCustomParameters({
        allow_signup: false,
      });
      
      firebaseClient.initializeApp(clientConfig);
      
      async function submit() {
          try {
            const response = await firebaseClient
              .auth()
              .signInWithPopup(githubProvider);
      
            console.log(response.additionalUserInfo);
          } catch (error) {
            alert(error);
          }
      }
      

      【讨论】:

        【解决方案5】:

        您可以使用电子邮件进行授权请求 insted username:

        用户名:mayGitHubEmail@mail.com 密码:accessToken

        like this with Postman

        body sent

        这是一个使用 Alamofire 和 SwiftyJSON pod 在 Swift 中使用类 func 的示例:

        import Alamofire
        import SwiftyJSON
        
        enum NetworkError: Error {
            case url
            case server
            case auth
        }
        
        class GistServices {
            
            class func makePostApiCall(toUrl path: String, withBody parameters: JSON, usingCredentials: Bool = false) -> Result<Data?, NetworkError> {
                
                guard let url = URL(string: path) else {
                    return .failure(.url)
                }
                if let email = UserAuthSingleton.shared.get(), let password = UserAuthSingleton.shared.getUserToken() {
                    var result: Result<Data?, NetworkError>!
                    
                    var request = AF.request(url, method: .post, parameters: parameters)
                    
                    if(usingCredentials){
                        let credentialData = "\(email):\(password)".data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue))!
                        
                        let base64Credentials = credentialData.base64EncodedString()
                        
                        
                        let headers = [HTTPHeader(name: "Authorization", value: "Basic \(base64Credentials)"),
                                       HTTPHeader(name: "Accept", value: "application/json"),
                                       HTTPHeader(name: "Content-Type", value: "application/json")]
                        
                        
                        
                        request = AF.request(url, method: .post,  parameters: parameters.dictionaryValue, encoder: JSONParameterEncoder.default, headers: HTTPHeaders(headers))
                    }
                    request
                        .validate(statusCode: 200..<300)
                        .validate(contentType: ["application/json"])
                        .response { (response) in
                        switch response.result {
                        case .failure(_):
                            result = .failure(.server)
                        case .success(let value):
                            result = .success(value)
                        }
                    }
                    return result
                }
                return .failure(.auth)
            }
        }
        
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-05
          • 2020-10-05
          • 1970-01-01
          • 1970-01-01
          • 2023-01-20
          • 1970-01-01
          • 2011-09-16
          相关资源
          最近更新 更多