2015-12-16 88 views
2

我想獲得授權承載頭的OAuth的目的,但它看起來有點混亂讀取文檔如何獲得授權承載頭?

use nickel::{Nickel, JsonBody, HttpRouter, Request, Response, MiddlewareResult, MediaType}; 

    // Get the full Authorization header from the incoming request headers 
    let auth_header = match request.origin.headers.get::<Authorization<Bearer>>() { 
     Some(header) => header, 
     None => panic!("No authorization header found") 
    }; 

這會產生錯誤:

src/main.rs:84:56: 84:86 error: the trait hyper::header::HeaderFormat is not implemented for the type hyper::header::common::authorization::Authorization<hyper::header::common::authorization::Bearer> [E0277]

望着實現它似乎對我是正確的:

https://github.com/hyperium/hyper/blob/master/src/header/common/authorization.rs

impl<S: Scheme + Any> HeaderFormat for Authorization<S> where <S as FromStr>::Err: 'static { 
    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { 
     if let Some(scheme) = <S as Scheme>::scheme() { 
      try!(write!(f, "{} ", scheme)) 
     }; 
     self.0.fmt_scheme(f) 
    } 
} 

https://github.com/auth0/rust-api-example/issues/1

回答

2

望着用於Authorization的文檔,我們可以看到,它確實實現Header

impl<S: Scheme + Any> Header for Authorization<S> 
    where S::Err: 'static 

所以你在正確的軌道上。我的猜測是,你遇到了更加陰險的事情:同一箱子的多個版本。

具體來說,我今天編譯的鎳版本(0.7.3)取決於超0.6.16。但是,如果我在Cargo.toml中添加hyper = "*",那麼我的也是可以獲得最新版本的hyper - 0.7.0。

由於看起來很不直觀,因此來自超0.7的項目與超0.6的項目不兼容。這也沒什麼具體的超過任何一個;對於所有的箱子都是如此。

如果您更新您的依賴關係以鎖定到鎳所需的相同版本的hyper,那麼您應該很好。


Cargo.toml

# ... 

[dependencies] 
hyper = "0.6.16" 
nickel = "*" 

的src/main.rs

extern crate nickel; 
extern crate hyper; 

use hyper::header::{Authorization, Bearer}; 
use nickel::{HttpRouter, Request}; 

fn foo(request: Request) { 
    // Get the full Authorization header from the incoming request headers 
    let auth_header = match request.origin.headers.get::<Authorization<Bearer>>() { 
     Some(header) => header, 
     None => panic!("No authorization header found") 
    }; 
} 

fn main() {} 
+0

它看起來與https://github.com/rust-lang相關/ cargo/issues/1636,通配符也是[已棄用](http://doc.crates.io/faq.html#can-libraries-use-*-as-a-version-for-their-dependencies?)和又一個[依賴 - 地獄問題](http s://en.wikipedia.org/wiki/Dependency_hell) – Marcos

+0

@Marcos通配符依賴關係已棄用*用於發佈的庫*。二進制文件可能會使用它們,因爲它們有相應的'Cargo.lock'文件。有趣的是,這與傳統的依賴地獄問題相反。在那裏,你不能有相同箱子的衝突版本。在這裏,你可以,但如果你試圖交替使用它們,它們會發生衝突。 – Shepmaster