22356


OAuthSwift を使ってはてなの OAuth 認証を使おうとしています。OAuth の仕様に詳しい方に、この変更が正しいのか伺いたく思います。

[サンプルプロジェクト (GitHub)](https://github.com/Nyoho/HatenaBookmarkAPITest)
を作って試したところ、最後のアクセストークンを取得するところで 401 で `oauth_problem=token_rejected`
が返ってきてしまうエラーに悩まされていましたが、  
OAuthSwift のソースを追いかけてみると、  
`OauthSwifthClient.swift` の `makeRequest()` の中で最後の `request.headers` で
`oauth_token=\"hogehoge%253D%253D\"` となっており、`oauth_verifier` も同様に `%253D`
が含まれていました。

本来は `hogehoge%3D%3D` という文字列が post されなければならないのに '=' が2重にURLエンコードされているのです。

そこで、 `OAuthSwift/OAuth1Swift.swift` の `postOAuthAccessTokenWithRequestToken`
の中でパラメタとして渡される `oauth_token` と `oauth_verifier` を、先に
`.stringByRemovingPercentEncoding` することで一旦 URL エンコードを解除するという[変更をしました (commit
eca80d176725c25c4a36df8b6e775f48d35f405f)](https://github.com/Nyoho/OAuthSwift/commit/eca80d176725c25c4a36df8b6e775f48d35f405f)。  
するとうまく OAuth 認証が通るようになりました。

OAuth の正しい方法として、この変更でよいのでしょうか?


CC BY-SA 3.0
2016-02-21T09:28:05.370
22350
2016-02-21T13:49:15.810
5990
question
swift macos oauth
OAuthSwift ではてなの OAuth を使うときに二重URLエンコードされないようにする正しい方法は?


[OAuth1 exchange fails due token secret being URL encoded. · Issue #140 ·
OAuthSwift/OAuthSwift](https://github.com/OAuthSwift/OAuthSwift/issues/140)

おそらく上のIssueでの修正漏れですね。ここでの修正に従うなら `self.client.credential`
の中身はURLエンコードされていない文字列になるべきですが、Authorization時のコールバックでクエリストリングをURLデコードせずに
`self.client.credential` に格納してしまっているようです。

<https://github.com/OAuthSwift/OAuthSwift/blob/0.5.0/OAuthSwift/OAuth1Swift.swift#L54-L69>

ですから `postOAuthAccessTokenWithRequestToken`
までにURLデコードすること自体は間違っていませんが、前述のハンドラ関数の中でデコードしてから格納するようにした方がよいと思います。

（手元にSwiftの開発環境ないですし、IssueやPullRequestの投稿は遠慮しておきます）


CC BY-SA 3.0
2016-02-21T11:33:01.400
22356
2016-02-21T13:49:15.810
2016-02-21T13:49:15.810
8000
8000
22350
answer